簡體   English   中英

Python 3:應用遞歸比較列表?

[英]Python 3: applying recursion to compare lists?

我正在嘗試使用以下代碼定義一個函數,該函數帶有兩個參數list_1和list_2,並按如下方式進行比較:如果list_1和list_2的長度不同,則返回False,如果list_1和list_2相同,則返回True,否則返回索引列表之間的第一個不匹配元素。

到目前為止,我有這個:

if len(list_1) != len(list_2):
    return False
elif list_1 == list_2:
    return True
else:
    i = 0
    if list_1[i] == list_2[i]:
        return i
    else:
        i += 1
        compare_lists(list_1, list_2)

從邏輯上講,當我再次調用該函數時,我一直重置為0。 有誰知道我能克服這個問題嗎?

您必須將i工作變量向下傳遞給每個函數。

另外,您不應該檢查每個函數中的列表是否相等,或者它們的長度是否不同,因為list_1 == list_2語句會導致“幕后” for循環迭代,這會破壞遞歸的意義。在兩個列表上。 這將大大降低性能。

相反,只需要捕捉當前索引超出列表之一末尾的情況即可。 在這種情況下,如果它們的長度都相同,那么我們可以返回True 否則,我們返回False因為我們到達了一個的結尾,但沒有到達另一個。

在上述情況不適用於該函數調用的索引的情況下,我們只需檢查索引處的元素是否相同即可。 如果不是,我們將返回索引(索引將通過我們的父母傳遞給初始調用者)。 否則,我們返回使用相同列表但以增加的索引( i + 1 )調用自己(孩子)的結果。

def compare_lists(list_1, list_2, i=0):
    l1 = len(list_1)
    l2 = len(list_2)
    if i >= l1 or i >= l2:
        return l1 == l2
    if list_1[i] != list_2[i]:
        return i
    return compare_lists(list_1, list_2, i+1)

它按預期工作:

>>> compare_lists([6,4,2], [6,4,2])
True
>>> compare_lists([6,4,2], [6,4,3])
2
>>> compare_lists([6,4,2], [6,4])
False

暫無
暫無

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

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