[英]Python Recursion Function to find Maximum Value
嘿伙計們,我不擅長遞歸 function 問題。 有人可以告訴我一個很好的資源來了解這一點,而且在這個問題中我不明白遞歸是如何工作的? 如果有人能解釋這種情況,那就太好了。
items = [6, 20, 8, 19, 56, 23, 87, 41, 49, 53]
def find_max(items):
if len(items) == 1:
return items[0]
op1 = items[0]
# print(op1)
op2 = find_max(items[1:])
# print(op1, op2)
if op1 > op2:
return op1
else:
return op2
print(find_max(items))
在第一次迭代中,包含[6, 20, 8, 19, 56, 23, 87, 41, 49, 53]
的列表將元素6
放入op1
中。 然后,它再次調用 function,這次使用列表[20, 8, 19, 56, 23, 87, 41, 49, 53]
沒有第一個元素,並將其最大值放入op2
。 讓我們假設遞歸有效,因此它確實為您提供了op2
中列表[20, 8, 19, 56, 23, 87, 41, 49, 53]
的最大值。 所以列表的最大值是op1
和op2
之間的最大值。
我們在這里做了什么? 我們把我們的大問題(找到最大值)分成更小的部分:讓我們找到6
和較小列表的最大值之間的最大值。 然后你一遍又一遍地應用這個步驟,直到列表只剩下一個元素——這是最大值。 這是使用遞歸、分而治之的一種方式。
當您與遞歸作斗爭時,您的陪伴很好。 計算機科學中的遞歸意味着 function 調用自身。
為了解釋它,我將從一個更簡單的 function 開始:
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def add_list(items):
if len(items) == 1:
return items[0]
op1 = items[0]
op2 = add_list(items[1:])
return op2 + op1;
print(add_list(items))
此 function 應添加稱為“項目”的列表的所有元素。 術語op1 = items[0]
將第一個列表項分配給op1
。 之后 function 調用自己(遞歸),並使用一組減少的列表項,即沒有1
的items
。 術語items[1:]
削減了導致[2, 3, 4, 5, 6, 7, 8, 9, 10]
的第一項。 該過程在這里等待,直到遞歸調用完成。 您可以假設這是調用了add_list
的新 function 實例。 現在,相同的過程再次從簡化列表開始。 這種情況一直持續到列表只包含一個元素。 然后魔法發生了。 整個遞歸鏈回滾。 期限
if len(items) == 1:
return items[0]
被擊中。 最后一次遞歸調用返回列表items
的最后一項。 現在鏈返回到之前的add_list
調用。 op2 獲取items
的最后一項,這里是 10。這個鏈元素將返回 (10 + 9)。 然后遞歸回滾到前一層,op2 將得到值 (10 + 9)。 這個鏈元素將返回 (10 + 9) + 8; 等等。
function find_max
。 但是,遞歸鏈不會對這些值求和,而是通過以下方式返回最大值:
if op1 > op2:
return op1
else:
return op2
而不是return op2 + op1
。
每次 function 調用自己時,它都會從列表中取出第一項並將其放入op1
,然后將列表的 rest 傳遞到下一個遞歸。 請注意,這發生在 function 返回之前以及在它實際嘗試找到最大值之前。 在下一個遞歸開始之前,每個遞歸只運行到這一行。
op2 = find_max(items[1:])
這種情況一直持續到您的列表只剩下一個項目,列表中的所有其他項目都分配給op1
的不同版本,每個遞歸層中都有一個。 當列表只有一項長時,您調用的最后一個 function 是第一個返回的。
if len(items) == 1:
return items[0]
然后下一個可以繼續實際運行代碼的比較部分:
if op1 > op2:
return op1
else:
return op2
接下來發生的事情是,所有函數都以與調用順序相反的順序返回,每次都決定是保留其op1
的本地值還是前一個遞歸op2
的返回值。 一旦所有功能都返回,您將獲得最高的項目。
這不是進行遞歸的好方法,因為這意味着您有一個“堆棧”的函數都在等待同時返回。 列表越長,堆棧越深。 最終,您將達到解釋器的最大遞歸深度,或者用完 memory。 更好的方法稱為尾遞歸,但我不確定 Python 解釋器是否真的支持這一點,所以通過改變任何東西可能不會獲得任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.