1

这段代码让我迷路了。运行时,它会输出我觉得奇怪的序列:

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),似乎比我想象的要复杂得多,我不知道如何跟踪这个函数调用并解释结果......

4

2 回答 2

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”
于 2013-10-04T15:16:31.460 回答
1

我喜欢凯文的回答,但让我对“理解递归”添加几句话:

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

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

这使您可以很好地了解正在发生的事情。

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

于 2013-10-05T15:26:42.470 回答