解释可能与范围相关的递归调用

时间:2013-08-04 06:50:15

标签: ios objective-c recursion scope cs193p

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

2 个答案:

答案 0 :(得分:0)

  

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

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

if (topOfStack) [stack removeLastObject];

答案 1 :(得分:0)

你写道:

  

我知道每次调用它时都会从堆栈中弹出一个对象。当达到基本情况时,我们在结束时返回一个double。每次调用它时堆栈是否被修改?

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

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

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

HTH。