【问题标题】:Python 3: applying recursion to compare lists?Python 3:应用递归来比较列表?
【发布时间】:2019-04-25 10:11:45
【问题描述】:

我正在尝试使用以下函数定义一个函数,该函数接受两个参数 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=0 放在if 语句之外(之前)。在您的代码中, i 的值永远不会改变..

标签: python list if-statement recursion compare


【解决方案1】:

您必须将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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多