簡體   English   中英

為什么在這個實現中遞歸比迭代快? (Python 反轉鏈表)

[英]Why is recursion faster than iteration in this implementation? (Python Reverse a Linked List)

我已經通過迭代和遞歸解決了“反向鏈表”問題。 結果出乎我的意料。 我正在使用 leetcode,所以我的迭代版本擊敗了所有 python3 提交的 27.7%,而我的遞歸版本擊敗了 95.97% 的解決方案。 我知道這可能是由於尾調用優化,但我不明白它是怎么回事。 有人可以澄清這一點嗎?

這是我的兩種實現的代碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#def reverseList(self, head: ListNode) -> ListNode:
#            
#            prev = None
#            
#            while head:
#                headsNext = head.next
#                head.next = prev
#                prev = head
#                head = headsNext
#                
#            head = prev
#            
#            return head

class Solution:
    def reverseList(self, head: ListNode, prev = None) -> ListNode:

            if not head:
                return prev

            headsNext = head.next
            head.next = prev
            prev = head



            return self.reverseList(headsNext, prev)

我做了一些性能測試,這兩個功能非常接近。 這可能會使差異下降到誤差范圍內,並給人以遞歸版本更快的印象。

您可以通過減少分配數量來確保迭代版本更快:

def reverseList1( head: ListNode) -> ListNode:            
    prev = None      
    while head:
        prev,head.next,head = head,prev,head.next                  
    return prev

即使你在遞歸函數中做同樣的事情:

def reverseList2(head: ListNode, prev = None) -> ListNode:
    if not head: return prev
    prev,head.next,head = head,prev,head.next
    return reverseList2(head, prev)

編輯多次運行性能測試后,性能差異變得微不足道。 迭代和遞歸版本有時在每次測試運行時執行得更快或更快。 這意味着速度分數毫無意義,因為所有版本在誤差范圍內都具有相同的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM