【问题标题】:Store Subsequences in list of lists using recursion in python使用python中的递归将子序列存储在列表列表中
【发布时间】:2021-12-13 23:33:13
【问题描述】:

这听起来很简单,我尝试搜索解决方案但找不到它因此发布问题。感谢您的帮助,在此先感谢。

我正在尝试使用递归在 python 中打印给定列表/字符串的所有子序列。 以下是我期望的输出:

给定输入列表:[1,3,2] 输出列表:[[],[1],[3],[2],[1,2],[1,3],[3,2],[1,3,2]]

这是我尝试过的:

def printSubsequences(ind,ans,l,n):
    final_ans = []
    if ind == n:
        return ans
    else:
        ans.append(l[ind])
        final_ans.extend(printSubsequences(ind+1,ans,l,n))
        
        ans.pop()
        
        final_ans.extend(printSubsequences(ind+1,ans,l,n))
        return final_ans
       
print(printSubsequences(0,[],[1,3,2],3))

Output of above code: [1, 3, 2, 1, 3, 1, 2, 1, 3, 2, 3, 2]

输出部分正确,因为它不包含[](空子集),但我希望它采用上述指定格式。我也尝试了append 方法,但那是给Output : [[[[], []], [[], []]], [[[], []], [[], []]]]

我不明白我在这里做错了什么,有人可以解释一下 - 为什么append 失败而extend 正在工作,我怎样才能获得我想要的输出?

【问题讨论】:

    标签: python-3.x recursion subsequence


    【解决方案1】:

    你遇到了这个经典的蟒蛇陷阱:

    当您将ans 附加到结果列表时,它始终是对同一列表ans 的引用,而不是副本。因此,当您调用ans.pop() 时,您会删除该列表的最后一个元素,并在所有子序列中将其删除。试试这个代码:

    a = [2]
    b = [a, a, a]
    print(b) # [[2], [2], [2]]
    a.pop()
    print(b) # [[], [], []]
    

    解决方法是采用更实用的样式,从不就地修改ans 列表,而是在递归调用需要时构建一个新列表:

    def subsequences(ind,ans,l,n):
        final_ans = []
        if ind == n:
            return [ans]
        else:
            final_ans.extend(subsequences(ind+1,ans + [l[ind]],l,n))
            final_ans.extend(subsequences(ind+1,ans,l,n))
            return final_ans
    
    >>> subsequences(0, [], [1,2,3], 3)
    [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]
    

    值得注意的修改:

    • 我将函数重命名为 subsequences 而不是 printSubsequences,因为它不打印;
    • 我修复了基本情况,应该是return [ans],而不是return ans
    • 我在递归调用中用+ 替换了对ans.appendans.pop 的调用。

    【讨论】:

    • 谢谢,这工作!我现在明白了。 pop() 正在删除所有以前的引用。
    猜你喜欢
    • 2021-05-13
    • 2014-07-31
    • 2020-02-06
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多