【问题标题】:How to understand this nested recursion?如何理解这种嵌套递归?
【发布时间】:2013-10-05 23:26:42
【问题描述】:

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

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),好像比我想象的要复杂很多,不知道怎么去追踪这个函数调用并解释结果...

【问题讨论】:

    标签: python recursion


    【解决方案1】:

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

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

    在这里,发生的事情更明显:您打印号码,然后使用number-1 调用print_n 两次。您可以向后推导出输出。

    • 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”

    【讨论】:

    • 可以看到递归here
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2021-05-15
      • 2012-11-08
      • 1970-01-01
      • 2016-10-14
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多