如何理解这个嵌套递归?

时间:2013-10-04 15:04:20

标签: python recursion

这段代码让我输了。运行时,它会输出我发现奇怪的序列:

def print_n(number):
    if (number <= 0):
         return None
    else:
         print number
         print_n(number-1)
    print_n(number-1)

print_n(4)

我以为它会输出这个序列:

  

4,3,2,1,1,2,1,3,2,1

然而它确实输出:

  

4,3,2,1,1,2,1,1,3,2,1,1,2,1,1

我试图绘制这个函数的堆栈图,但是当我在print_n(number-1)的第二次出现时迷路了。

我可以在没有print_n(number-1)的第二次出现的情况下理解这个程序,因为它只是正常的递归。但是,第二个print_n(number-1),似乎比我预期的要复杂得多,我不知道如何跟踪这个函数调用并解释结果......

2 个答案:

答案 0 :(得分:7)

由于if块具有无条件返回,您可以删除else,程序将继续以相同的方式运行。

def print_n(number):
    if (number <= 0):
        return None
    print number
    print_n(number-1)
    print_n(number-1)

此处,更明显的是:您打印号码,然后使用print_n拨打number-1两次。您可以向后工作以获得输出。

  • print_n(1)打印“1”
  • print_n(2)打印“2”加“1”加“1”:“211”
  • print_n(3)打印“3”加“211”加“211”:“3211211”
  • print_n(4)打印“4”加“3211211”加“3211211”:“432112113211211”

答案 1 :(得分:1)

我喜欢凯文的答案,但是让我在“理解递归”中添加几句话:

我经常建议使用代表堆栈的纸张。每张纸包含其本地变量和当前状态 - 您可以用笔标记要“处理”的行。

使用单独的工作表作为输出/控制台。

这使您非常了解正在发生的事情。

当然,在调试器中跟踪代码并检查堆栈跟踪也很有帮助。但首先尝试纸张方法!