繁体   English   中英

while循环内的递归

[英]recursion within a while loop

我正在处理一个 leetcode 问题Reconstruct Itinerary ,这里有一个非常简洁和公认的答案,也粘贴在下面。 我通常在 for 循环中使用递归。 我不明白这次visit究竟是如何工作的,为什么它会输出相反的行程? 你能帮我消化这段代码吗? 我之前从未在 while 循环中使用过递归,它可能比 for 循环中的递归具有某些优势。

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        graph=collections.defaultdict(list)
        for edge in tickets:
            graph[edge[0]].append(edge[1])
        for i in graph:
            graph[i].sort(reverse=True)
        ans=[]

        def visit(current):
            while graph[current]:
                visit(graph[current].pop())
            ans.append(current)
            print(ans,current)  # This line added by me

        visit("JFK")
        return ans[::-1]
test case: 
    tickets = [["JFK","KUL"],["JFK","NRT"],["NRT","JFK"]]
output:
    ans[::-1] 
      ['JFK', 'NRT', 'JFK', 'KUL']

想象一棵树,其中每个节点都有可变数量的子节点。 它可以是 0 或 10,000 或任何其他非负 integer。 while 循环只是遍历节点current的每个子节点。 请注意

while graph [current] 

当列表非空时为真。 current列表的每个元素通过弹出下一个元素传递到调用站点的下一个递归级别。 具体来说

graph[current].pop()

同时从列表中删除元素并传递到下一级递归。

ans是相反的顺序,因为在附加当前节点之前,所有节点都首先完全探索深度。 你可以通过移动看到这个

ans.append(current)

while循环之前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM