【问题标题】:Adding an integer to a sorted list - recursively将整数添加到排序列表 - 递归
【发布时间】:2017-09-21 10:07:02
【问题描述】:

我需要以递归方式将 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 怎么了?

【问题讨论】:

    标签: python python-3.x list recursion


    【解决方案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
    

    【讨论】:

    • 但是,我认为这可能是错误的方法。我们在 Uni 中使用二叉树。该函数应该能够将任何数字放入列表中,但如果“叶子”变成内部节点,还可以在必要时创建一个空列表。例如: >>> our_tree = insert(5, [ ]) 5 >>> our_tree = insert(10, our_tree) [[], 5, 10] >>> our_tree = insert(7, our_tree) [[], 5, [7, 10, []]] >>> our_tree = insert(1, our_tree) [1, 5, [7, 10, []]]
    • @AntonHansson 我不确定“树”和“内部节点”是什么意思。我想说的是,你应该避免在你的情况下进行破坏性操作。 “索引”只是一种选择。但是,如果您有后续问题,您可以简单地提出一个新问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多