这段代码让我输了。运行时,它会输出我发现奇怪的序列:
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)
,似乎比我预期的要复杂得多,我不知道如何跟踪这个函数调用并解释结果......
答案 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)
我喜欢凯文的答案,但是让我在“理解递归”中添加几句话:
我经常建议使用代表堆栈的纸张。每张纸包含其本地变量和当前状态 - 您可以用笔标记要“处理”的行。
使用单独的工作表作为输出/控制台。
这使您非常了解正在发生的事情。
当然,在调试器中跟踪代码并检查堆栈跟踪也很有帮助。但首先尝试纸张方法!