我自学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,
何时被执行?阅读这段代码,我认为我们在评估每个节点后循环回到函数的顶部,然后当我们到达第3个和最后一个节点时,终止语句if list == None: return
将被满足,然后代码将退出循环,永远不会到达最底部的print语句。显然,这并没有发生,因为正在调用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
答案 0 :(得分:3)
让我们解析代码逐节点地做什么
print_backward
调用node1
node1 == None
没有?不,我们继续head = node1
tail = node1.next
指定为tail = node2
print_backward(tail)
称为print_backward(node2)
print_backward
node2
node2 == None
没有?不,我们继续head = node2
tail = node2.next
指定为tail = node3
print_backward(tail)
称为print_backward(node3)
print_backward
node3
node3 == None
没有?不,我们继续head = node3
tail = node3.next
指定为tail = None
print_backward(tail)
称为print_backward(None)
print_backward
None
None == None
没有?是的,所以我们返回print head,
被调用,与print node3,
相同(打印" 3")print head,
被调用,与print node2,
相同(打印" 2")print head,
被调用,与print node1,
相同(打印" 1")总输出是" 3 2 1"!
答案 1 :(得分:2)
递归并不意味着跳到函数的顶部;它意味着在函数中调用相同的函数。
我认为一个更简单的例子使其更加明显:
graphql-js
当我们拨打def count(number):
if number <= 0: return
count(number-1)
print(number)
时,该功能会打印数字1到3.为什么?因为这是发生的事情:
count(3)
被召唤。count(3)
为3,不低于或等于零,所以我们不要number
。return
:
count(3-1)
被召唤。count(2)
为2,不低于或等于零,因此我们不会number
。return
:
count(2-1)
被召唤。count(1)
为1,不低于或等于零,所以我们不要number
。return
:
count(1-1)
被召唤。count(0)
为0,等于零,因此我们number
为上一级。return
1。print
2。print
3。