结合两个列表和递归排序

时间:2016-05-02 19:22:04

标签: python sorting recursion

我尝试定义一个名为combine的函数,将两个列表作为参数,并以递归方式将它们组合成一个排序列表。

def combine (l1,l2):
    if l1 == []:
        return l2
    elif l2 == []:
        return l1
    elif l1 == [] and l2 == []:
        return []
    sort_l = []
    index = 0
    for num in l1:
        if num <= l2[0]:
            sort_l.append(num)
            index += 1
        else:
            return combine(l2, l1[index:])
    return sort_l + l2

它给了我:

combine([1,3,5,7,9],[0,2,4,6,8]) -> [8, 9] 

但应该:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

任何建议???

4 个答案:

答案 0 :(得分:3)

python列表可以与简单的+结合使用,内置函数sorted()将为您排序列表中的项目。

sorted(l1 + l2) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 1 :(得分:0)

你的方法是正确的。但是,您在每次递归调用中重新分配sort_l。您需要在函数外定义它,或者在每次创建函数后传递它:

sort_l = []

def combine (l1,l2):
    if l1 == []:
        return l2
    elif l2 == []:
        return l1
    elif l1 == [] and l2 == []:
        return []
    index = 0
    for num in l1:
        if num <= l2[0]:
            sort_l.append(num)
            index += 1
        else:
            return combine(l2, l1[index:]) 
    return sort_l + l2

def combine (l1,l2, sort_l=None):
    if sort_l is None:
       sort_l = []
    if l1 == []:
        return l2
    elif l2 == []:
        return l1
    elif l1 == [] and l2 == []:
        return []
    index = 0
    for num in l1:
        if num <= l2[0]:
            sort_l.append(num)
            index += 1
        else:
            return combine(l2, l1[index:], sort_l) # pass it here
    return sort_l + l2

combine([1,3,5,7,9],[0,2,4,6,8]) # Don't pass any list, it will be created in first call.

答案 2 :(得分:0)

程序应该是这样的:

<td align="right" id="marketUpdate_lastTrade" class="compProfileTextBold">62.90</td>

答案 3 :(得分:0)

你很亲密。诀窍是将l1[0]l2[0]中较小的一个放在递归combine()的结果前面:

def combine (l1,l2):
    if l1 == []:
        return l2
    if l2 == []:
        return l1
    if l1[0] <= l2[0]:
        return [l1[0]] + combine(l1[1:], l2)
    return [l2[0]] + combine(l1, l2[1:])