将一个整数添加到排序列表中 - 递归

时间:2017-09-21 10:07:02

标签: python python-3.x list recursion

我需要递归地将int添加到列表中,稍后还要添加其他功能。

def insert_in_list(x, tree):
    if not tree:
        return tree
    elif isinstance(tree[0], list):
        return inserting(x, tree[0]) + inserting(x, tree[1:])
    elif x < tree[0]:
        tree.insert(0, x)
        return tree
    else:
        return inserting(x, tree[1:])

我正在使用insert()。但出于某种原因,我的列表似乎仅限于3个值。例如

>>> insert_in_list(2, [1,5,10]) 
[2,5,10]

1发生了什么?

1 个答案:

答案 0 :(得分:1)

因为您的上一个案例会丢弃第一个值。您将首先拨打insert_in_list(x, tree)并在案例4中结束,它将调用insert_in_list(x, [5, 10])。然后,这将结束于案例3并在第一个位置插入x,然后返回新列表[2, 5, 10]

处理指数可能更容易:

def insert_in_list(x, tree, index=0):
    if not tree:
        return tree
    elif x < tree[index]:
        tree.insert(index, x)
        return tree
    else:
        return insert_in_list(x, tree, index+1)

我刚刚省略了第二个案例,因为它与你的问题无关:

>>> insert_in_list(2, [1,5,10])
[1, 2, 5, 10]

请注意,如果您的tree已排序,您还可以进行二分而不是递归,以找到应插入值的位置。例如,使用递归二分法并基于bisect.insort_right

def insert_in_list(x, tree, lo=0, hi=None):
    if not tree:
        return tree

    if hi is None:
        hi = len(tree)
    if lo < hi:
        mid = (lo + hi) // 2
        if x < tree[mid]: 
            hi = mid
        else: 
            lo = mid + 1
        return insert_in_list(x, tree, lo, hi)

    tree.insert(lo, x)
    return tree