前言:这是我以前在我的数据结构和算法类中进行的考试的WAS。
问题:修改此函数,以便返回L1和L2中的项目的排序列表。例如,给定[1,2,3,4,5],[0,2,3,5,8],函数应返回[2,3,5]。该函数必须以某种方式使用递归。
def merge(L1, L2):
if L1 == []:
return L2
elif L2 == []:
return L1
elif L1[0] <= L2[0]:
return L1[:1] + merge(L1[1:], L2)
else:
return L2[:1] + merge((L1, L2[1:])
我将功能修改为:
def merge(L1, L2):
if L1 == []:
return L1
elif L2 == []:
return L2
elif L1[0] < L2[0]: #Push L1 forward
return merge(L1[1:], L2)
elif L1[0] > L2[0]: #Push L2 forward
return merge(L1, L2[1:])
elif L1[0] == L2[0]: #If same element, return element
return L1[:1] + merge(L1[1:], L2[1:])
我使用基本的if语句向前推送列表,确保每个列表中的每个元素都相互检查。它已经很晚了,我之前的代码一直在返回[2,3,5,8],因为我最初有:
if L1 == []:
return L2
elif L2 == []:
return L1
当L1耗尽时,它将返回L2的其余部分。然后重新输入代码并意外输入:
if L1 == []:
return L1
elif L2 == []:
return L2
它有效!输出是[2,3,5],但是对我来说没有意义
我的问题是:
为什么返回耗尽列表的前两个if语句会给出输出[2,3,5]?
为什么返回空列表会突破递归函数?
最后,如果我的列表在递归函数中耗尽,是否有办法打破if语句链?
答案 0 :(得分:3)
为什么返回耗尽列表的前两个if语句给出输出[2,3,5]?
因为当其中一个列表中没有剩余元素时,空列表与其他列表的其余部分之间没有任何共同点。
为什么返回空列表会突破递归函数?
return L1
和return L2
是递归的基本条件。一旦满足它们,我们就得到了一个确定的值(而不是另一个递归级别)。除非我们决定递归,否则一旦满足基本条件,递归将展开并返回结果。
答案 1 :(得分:0)
您想要找到两个列表的交集。因此,如果其中一个列表为空,则需要返回一个空列表,因为交集将是[]。
输出返回[2,3,5]因为先前的递归调用有
elif L1[0] == L2[0]:
return L1[:1] + merge(L1[1:], L2[1:])
因此,从上述陈述中,应添加的唯一元素将是两个列表共有的元素 该声明也可以修改为:
return L1[0] + merge(L1[1:], L2[1:]) #add the common element and merge the remaining parts