Python 如何理解这种嵌套递归?

Python 如何理解这种嵌套递归?,python,recursion,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

这个密码把我弄丢了。运行时,它会输出我觉得奇怪的序列:

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,1,2,1,1

我试图绘制这个函数的堆栈图,但是当我在第二次出现print\u nnumber-1时迷路了

我不需要第二次出现print_nnumber-1就可以理解这个程序,因为它只是普通的递归。但是,第二个print编号1似乎比我预期的要复杂得多,我不知道如何跟踪此函数调用并解释结果…

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

def print_n(number):
    if (number <= 0):
        return None
    print number
    print_n(number-1)
    print_n(number-1)
在这里,更明显的是发生了什么:您打印号码,然后使用数字1调用print\n两次。您可以向后推导出输出

打印1打印1 打印\u n2打印2加1加1:211 打印\u n3打印3加211加211:3211211 打印4加3211211加3211211:432112113211211 由于if块具有无条件返回,因此可以删除else,程序将继续以相同的方式运行

def print_n(number):
    if (number <= 0):
        return None
    print number
    print_n(number-1)
    print_n(number-1)
在这里,更明显的是发生了什么:您打印号码,然后使用数字1调用print\n两次。您可以向后推导出输出

打印1打印1 打印\u n2打印2加1加1:211 打印\u n3打印3加211加211:3211211 打印4加3211211加3211211:432112113211211
我喜欢Kevin的答案,但让我补充几句来理解递归:

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

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

这让你对正在发生的事情有了很好的理解


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

我喜欢Kevin的答案,但让我补充几句来理解递归:

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

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

这让你对正在发生的事情有了很好的理解

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

你可以看到递归你可以看到递归