[英]Understanding recursive functions calls
考虑以下代码:
def print_mah(n):
if n <= 0:
return
else:
print('mah')
print_mah(n-1)
print_mah(3)
在这里,Python检查n是否小于或等于0,它发现这是False,因此它打印'mah'并用n-1调用相同的函数,直到n等于0,因此'mah'被打印3次。
但是,请考虑以下操纵代码:
def print_mah(n):
if n <= 0:
return
else:
print_mah(n-1)
print('mah')
print_mah(3)
Python检查n是否小于或等于0,它发现这是False,因此再次用n-1调用同一函数,并且'mah'也被打印3次。
我的问题是,为什么不一次打印'mah',换句话说,为什么不使用n = 2调用print_mah,然后Python发现条件为False ,所以用n = 1进行调用,并找到条件为False ,因此它以n == 0进行调用,并发现条件为True ,因此该函数返回,并且在打印'mah'之后仅返回一次。
要了解不同之处,这可能会有所帮助。
算法1
def print_n(n):
if n <= 0:
return
else:
print_n(n-1)
print(n)
算法2
def print_n(n):
if n <= 0:
return
else:
print(n)
print_n(n-1)
这些算法应提供不同的结果,也许这是进一步研究的良好起点。
一些帮助
如果在另一个函数(f1)中调用一个函数(f2),则当前函数(f1)将等待,直到被调用函数(f2)完成。
一些研究关键词
Python发现条件为False,因此以n = 1对其进行调用,并发现条件为False,因此以n == 0对其进行调用,并发现该条件为True,因此该函数返回
这实际上是第二个版本的确切执行路径。 但是,也许您看不到,当函数返回时,它会像递归调用一样返回在递归调用返回后从中断处恢复的位置。
因此,当n==1
,并将它与递归n==0
,那么它被返回和mah
被印刷在第一次,则该返回和mah
当打印n==2
,然后返回并mah
被印刷的第三和最后的时间。
这两个函数将打印mah
3次,因为在递归调用之后您没有返回任何内容。 当您在内部调用函数时,应该处理停止条件(您在第一个if条件中已经执行过),然后在此之后它不会退出程序,因为递归调用会生成一系列操作。 在最后一个操作停止后(返回某项),然后它将在返回的递归调用下方开始编译该函数的其余部分,直到到达该函数的末尾。
return
不会破坏整个调用堆栈,而不会破坏当前的函数调用。 在这种情况下:
def print_mah(n):
if n <= 0:
return
else:
print_mah(n-1)
print('mah')
print_mah(3)
在返回0之前, print_mah
被调用了3次。您可以认为它们只是嵌套的逻辑,如下所示:
def print_mah(n):
if n <= 0:
return
else:
print_mah(n-1) # Replace this line with new call
print('mah')
我们只是在注释的else语句内再次调用该函数。
def print_mah(n):
if n <= 0:
#return
else:
n = n-1
if n <= 0:
#return
else:
print_mah(n-1)
print('mah')
print('mah')
您会看到print('mah')依次显示在底部,正如所写的那样,当函数从调用堆栈中回退时,它将顺序打印。
这是第二个程序正在做的“跟踪”:
print_mah(3) ->
print_mah(2) ->
print_mah(1) ->
print_mah(0) ->
# Does nothing, essentially.
<-
# print_mah(1) continues running.
print('mah') # The last thing that print_mah(1) does.
<-
# print_mah(2) continues running.
print('mah')
<-
# print_mah(3) continues running.
print('mah')
<-
我们在这里看到的是print('mah')
出现了3次(因此,'mah'被打印了3次)。
我的问题是为什么不一次打印'mah',换句话说为什么不使用n = 2调用print_mah,然后Python发现条件为False,所以用n = 1进行调用,并找到条件为False,因此以n == 0进行调用,并发现条件为True,因此该函数返回,并且在打印“ mah”后仅返回一次。
该函数仅返回最内部的函数。 在调用print_mah
并实际打印之后,使用else
条件的两个功能级别将继续执行。 为简便起见,这是print_mah(2)
的逐行浏览。
print_mah(2)
# Enter print_mah - Level 1
if n <= 0: # n = 2
# ...
# False, continue to else
else:
print_mah(n-1) # n = 2
# Enter print_mah - Level 2
if n <= 0: # n = 1
# ...
# False, continue to else
else:
print_mah(n-1) # n = 1
# Enter print_mah - Level 3
if n <= 0: # n = 0
return
# Return None to print_mah - Level 2
print('mah')
# Function is complete, return None to print_mah - Level 1
print('mah')
# Function is complete, return None to the execution scope
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.