不理解递归函数的输出


def some_func(count):
if count > 0:
some_func(count-1)
print(count)
print(some_func(5))

输出为

1
2
3
4
5

根据我的理解,该函数将被简化为some_func(0(,并打印0作为最终输出。但实际输出是从1到5?每次迭代都发生了什么?

提前感谢!

注意语句执行的顺序!

some_func(5)
-- some_func(4)
---- some_func(3)
------ some_func(2)
-------- some_func(1)
---------- some_func(0)
---------- print(1)
-------- print(2)
------ print(3)
---- print(4)
-- print(5)

some_func(0)中,条件0>0不满足,因此跳过some_funcprint(0)函数调用。

首先这里有缩进的问题,请纠正这个问题,在函数末尾添加一点空白可以让事情变得清楚。

def some_func(count):
if count > 0:
some_func(count-1)
print(count)

print(some_func(5))

原因是,在递归中,递归调用旁边的代码被放入堆栈内存中,堆栈内存是后进先出结构,你可以在这里找到更多关于它的信息,直到代码的终止条件出现,后续语句的推送一直发生在堆栈的顶部。调用print(some_func(5))后发生的情况的示例可视化

  1. print(some_func(5)):5>0=>True,因此此时调用下一个cmd some_func(5-1(,会发生一些有趣的事情,在堆栈空间中,some_func(count-1)的所有后续语句都被推送,然后实际的方法调用开始,因此此时堆栈将如下所示:
|TOP_OF_STACK||--------------||print(5(|
  1. 要调用的下一行是some_func(4(:然后再次4>0=>正确因此调用some_func(4-1(并将随后的打印(4(推送到堆栈上,如下所示:
|TOP_OF_STACK||--------------||打印(4(||--------------||print(5(|
  1. some_func(3(:3>0=>没错,调用somefunc(3-1(并将print(3(推到堆栈顶部
|TOP_OF_STACK||--------------||打印(3(||--------------||打印(4(||--------------||print(5(|

some_func(2(和some_funcs(1(的情况相同,堆栈的末尾如下所示:

|TOP_OF_STACK||--------------||打印(1(||--------------||打印(2(||--------------||打印(3(||--------------||打印(4(||--------------||print(5(|

当调用some_func(0(时,会发生以下情况:0>0=>false,因此不会调用if之后的其他语句,并且到目前为止已推送到堆栈的所有语句都将从顶部按顺序弹出,这将导致执行打印语句,从而产生输出:

1
2
3
4
5

此外,有时您可能会遇到递归代码的堆栈溢出错误的一个可能原因是,如果您的终端条件不是有效的,那么推送会一直发生,直到内存中没有剩余空间为止!

希望这能让你更好地理解递归流。

最新更新