[英]Recursive function, final print statement
我正在使用如何像计算机科学家一样思考的方式自学Python。 我正在学习“节点和链接列表”。 这个递归函数使我感到困惑。 需要明确的是,该代码可以正常工作。 我问的是,底部的最后一行代码( print list,
)如何被执行?
我的问题是关于此递归函数的:
def print_backward (list):
if list == None: return #shouldn't the code terminate when this is satisfied?
print_backward(list.next)
print list, #seems like the function would terminate before this line
#ever gets called
有人可以告诉我,这最后一行print head,
何时执行? 阅读这段代码,我认为我们在评估完每个节点后会回到函数的顶部,然后当我们到达第三个节点和最后一个节点时, if list == None: return
,则终止语句if list == None: return
将被满足,并且代码将然后退出循环,从不到达最底部的打印语句。 显然,这不会发生,因为正在调用print语句。
我之所以问是因为,如果我不了解代码的工作原理,那感觉就像是我不是在真正地学习! 如果有人可以解释代码如何到达最终的打印语句(并且它已经到达那里),我将非常感激。 我希望我不要通过问这个来违反规则。 谢谢!
顺便说一句,我正在打印一个链接清单,货物是[1,2,3]。 向后打印,因此下面的[3,2,1]是更多上下文的代码。
class Node:
def __init__(self, cargo = None, next = None):
self.cargo = cargo
self.next = next
def __str__(self):
return str(self.cargo)
def print_list(node):
while node:
print node,
node = node.next
print
def print_backward (list):
if list == None: return
print_backward(list.next)
print list,
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node1.next = node2
node2.next = node3
node3.next = None
print_backward(node1)
输出为:
==== RESTART: /Users/Desktop/Programming Career/Untitled.py ====
3 2 1
让我们逐个代码分析代码在做什么
node1
调用print_backward
node1 == None
无? 不,我们继续 head = node1
tail = node1.next
与tail = node2
相同 print_backward(tail)
与print_backward(node2)
相同
node2
调用print_backward
node2 == None
无? 不,我们继续 head = node2
tail = node2.next
与tail = node3
相同 print_backward(tail)
与print_backward(node3)
相同
node3
调用print_backward
node3 == None
无? 不,我们继续 head = node3
tail = node3.next
与tail = None
相同 print_backward(tail)
与print_backward(None)
相同
None
调用print_backward
None == None
? 是的,所以我们回来 print node3,
3相同print head,
称为print head,
(打印“ 3”) print node2,
2相同print head,
称为print head,
(打印“ 2”) print node1,
1相同print head,
称为print head,
(打印“ 1”) 总输出为“ 3 2 1”!
递归并不意味着跳到函数的顶部; 这意味着在一个函数内调用相同的函数。
我认为一个更简单的示例将使其更加明显:
def count(number):
if number <= 0: return
count(number-1)
print(number)
当我们调用count(3)
,该函数将打印数字1到3。为什么? 因为这是发生的情况:
count(3)
被调用。 number
是3,不小于或等于零,因此我们不return
。 count(3-1)
:
count(2)
被调用。 number
为2,不小于或等于零,因此我们不return
。 count(2-1)
:
count(1)
被调用。 number
为1,不小于或等于零,因此我们不return
。 count(1-1)
:
count(0)
被调用。 number
为0,等于零,因此我们return
上一级。 print
1。 print
2。 print
3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.