首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3递归,for-循环函数返回奇怪的输出。

Python3递归,for-循环函数返回奇怪的输出。
EN

Stack Overflow用户
提问于 2020-03-05 19:25:35
回答 1查看 43关注 0票数 1

我的函数combinations(ary, p)适合于return,每个可能的组合,按列表中项目的顺序排列。但是它总是多次返回第一个值,即使它找到所有可能的命令,我知道,因为它打印它们。

编辑:我想让它发挥我自己的作用,学习一些东西,不使用任何外部语言。

代码语言:javascript
复制
def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:
            bary.append(ary)
        ary.append(ary.pop(p))
    return bary

另一个带有调试print()函数的版本。我会给出它的样本输出。

代码语言:javascript
复制
def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:

    -->     bary.append(ary)
    -->     print('ary', ary, 'bary', bary)

        ary.append(ary.pop(p))
    return bary

使用combinations([7,3,2], 0):运行后的控制台输出

代码语言:javascript
复制
##  There is clearly every possible combination:
##
##      ||
##      ||
        \/
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 2, 3], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 7, 2], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 3, 7], [2, 3, 7]]
[[7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2]]

最后一个列表被设定为包含每一个可能的顺序,但是它只有输入值顺序,即使它打印每一个顺序。我在哪里搞砸了return

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-05 19:54:28

你的问题是只有一份副本。你把它附加到bary很多次了。所以bary充满了同样的一份名单。任何时候你都会改变的。这将反映在所有这些问题上,因为它们都是相同的清单。

相反,当您附加到bary时,分配一个ary的副本,但作为它自己的一个新列表,这样当您更改ary时,它不会受到影响。

代码语言:javascript
复制
def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:
            bary.append(ary[:]) #Changed this line to take a shallow copy of ary
            print('ary', ary, 'bary', bary)

        ary.append(ary.pop(p))
    return bary

print(combinations([7,3,2], 0))

输出

代码语言:javascript
复制
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 3, 2], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 2, 7], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 7, 3], [2, 3, 7]]
[[7, 3, 2], [7, 2, 3], [3, 2, 7], [3, 7, 2], [2, 7, 3], [2, 3, 7]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60552655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档