簡體   English   中英

Python 遞歸 Function 找到最大值

[英]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]的最大值。 所以列表的最大值是op1op2之間的最大值。

我們在這里做了什么? 我們把我們的大問題(找到最大值)分成更小的部分:讓我們找到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 調用自己(遞歸),並使用一組減少的列表項,即沒有1items 術語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.

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