比较清单;返回唯一列表。 - Python

时间:2014-03-28 12:39:49

标签: python list if-statement recursion unique

前言:这是我以前在我的数据结构和算法类中进行的考试的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语句链?

2 个答案:

答案 0 :(得分:3)

  

为什么返回耗尽列表的前两个if语句给出输出[2,3,5]?

因为当其中一个列表中没有剩余元素时,空列表与其他列表的其余部分之间没有任何共同点。

  

为什么返回空列表会突破递归函数?

return L1return 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