0

我有点理解递归。我们从一种方法开始,它会调用自己,直到达到基本情况。请帮助我了解此代码的工作原理。我知道每次调用它时我们都会从堆栈中弹出一个对象,当达到基本情况时,我们最后会返回一个双精度值。每次调用堆栈时都会修改它吗?例如: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;
   }
4

2 回答 2

0

如果语句发送堆栈(3,5)返回5然后在第二次调用发送(3,5)并再次返回5,它进入乘法?

不会。第一次调用后,堆栈会减少。在第二次调用时,它只发送 (3)。修改栈的相关代码:

if (topOfStack) [stack removeLastObject];
于 2013-08-04T07:30:30.273 回答
0

你写:

我知道每次调用它时我们都会从堆栈中弹出一个对象,当达到基本情况时,我们最后会返回一个双精度值。每次调用堆栈时都会修改它吗?

所以你知道一个对象从堆栈中弹出,这意味着堆栈发生了变化。那么为什么你会认为堆栈没有被修改呢?

您是否可能将变量 stack的内容与它引用的对象混淆了?变量的内容stack不会改变 - 内容是对对象(或类型NSMutableArray)的引用。然而,被引用对象的内部状态会发生变化,每次都会removeLastObject被调用。

把它想象成一栋房子——它有一个街道地址(对对象的引用),里面有一些人(对象的内部状态)——当人们进出房子时(物品从堆栈中推入和弹出)然后内部状态不断变化,但房子的街道地址永远不会改变。

HTH。

于 2013-08-04T07:35:19.590 回答