我有点理解递归。我们从一个方法开始,它调用自己直到它达到它的基本情况。请帮助我了解此代码的工作原理。我知道每次调用时,我们都会从堆栈中弹出一个对象。当达到基本情况时,我们会在结束时返回一个双精度。每次都会修改堆栈它被称为?例如:3(回车)5(回车)*显然等于15.但是根据方法,当我看它时我遵循它进入乘法如果语句发送堆栈(3,5)返回5然后在第二次调用发送(3,5)并再次返回5?为什么第二个被发送堆栈(3)而不是(3,5)?
+ (double)popOperandOffProgramStack:(NSMutableArray *)stack
{
double result = 0;
id topOfStack = [stack lastObject];
if (topOfStack) [stack removeLastObject];
if ([topOfStack isKindOfClass:[NSNumber class]])
{
result = [topOfStack doubleValue];
}
else if ([topOfStack isKindOfClass:[NSString class]])
{
NSString *operation = topOfStack;
if ([operation isEqualToString:@"+"]) {
result = [self popOperandOffProgramStack:stack] +
[self popOperandOffProgramStack:stack];
} else if ([@"*" isEqualToString:operation]) {
result = [self popOperandOffProgramStack:stack] *
[self popOperandOffProgramStack:stack];
} else if ([operation isEqualToString:@"-"]) {
double subtrahend = [self popOperandOffProgramStack:stack];
result = [self popOperandOffProgramStack:stack] - subtrahend;
} else if ([operation isEqualToString:@"/"]) {
double divisor = [self popOperandOffProgramStack:stack];
if (divisor) result = [self popOperandOffProgramStack:stack] / divisor;
}
}
return result;
}
答案 0 :(得分:0)
如果语句发送堆栈(3,5)返回5然后在第二次调用发送(3,5)并再次返回5,它会进入倍增?
没有。第一次调用后,堆栈减少。在第二次调用时,它仅发送(3)。修改堆栈的相关代码:
if (topOfStack) [stack removeLastObject];
答案 1 :(得分:0)
你写道:
我知道每次调用它时都会从堆栈中弹出一个对象。当达到基本情况时,我们在结束时返回一个double。每次调用它时堆栈是否被修改?
所以你知道一个对象从堆栈中弹出,这意味着堆栈会发生变化。那么为什么你认为堆栈不被修改?
您是否可能会将变量 stack
的内容与其引用的对象混淆?变量stack
的内容不会更改 - 该内容是对对象的引用(或类型NSMutableArray
)。但是,每次调用removeLastObject
时,引用对象的内部状态都会发生变化。
把它想象成一个房子 - 它有一个街道地址(对象的引用),以及其中的一些人(对象的内部状态) - 当人们进入和离开房子时(推送和弹出的物品)堆栈)然后内部状态不断变化,但房子的街道地址永远不会改变。
HTH。