python - 关于尝试打印给定列表的所有排列的问题
问题描述
我只是想找出 python shell 没有给出我期望的以下递归代码的输出的原因是什么:
def permutator(list,track):
if len(list)==1:
track.append(list[0])
print (track)
else:
for n in range(len(list)):
track.append(list[n])
return permutator(list[:n]+list[n+1:],track)
当变量''track''初始化为空列表([])时,我希望此脚本打印给定列表的所有排列;例如,我希望permutator([1,2],[])
打印[1,2]
和[2,1]
. 但它只打印[1,2]
......它真的让我失望,因为我花了很多时间才想到将置换函数视为两个变量而不是一个变量的函数,这样轨道“文件”递归过程(顺序迭代过程),直到到达原始列表的排列。
那么我的错误是什么?它是基本的(所以代码的整个想法是错误的......)或者我只需要做一个小的变化才能让它开始工作?
我真的很想靠自己在这个问题上取得成功,但我已经放弃了,所以每一次帮助都会得到祝福!
解决方案
当您return
函数结束并且循环的其余部分永远不会执行时。此外,您不想追加到列表,因为这会影响传递给稍后调用的函数的列表 - 而只是传递列表,就像在作为参数追加之后一样。具体在这里,由于您只想打印值,因此无需返回,因此您可以这样做:
def permutator(list,track):
if len(list)==1:
track.append(list[0])
print (track)
else:
for n in range(len(list)):
permutator(list[:n]+list[n+1:],track + [list[n]])
如果您决定要返回所有排列而不是打印它们,则更改很容易:
def permutator(list,track):
if len(list)==1:
return track + [list[0]]
else:
perms = []
for n in range(len(list)):
perms.append(permutator(list[:n]+list[n+1:],track + [list[n]]))
return perms
推荐阅读
- typescript - 如何调试空的 Vue 错误?
- c# - 如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?
- c++ - 如何使类的构造函数根据参数访问重载函数?
- c - 如何通过字符串化访问结构成员(在 C 宏中使用 ## 或 #)?
- java - 我可以使用 MockMultipartFile 发送真实文件吗?
- r - 规范化 R 中的数据框
- ubuntu - gpssh-exkeys -f 主机列表不起作用。Greenplum
- java - 如何使用 Twitter4j 从搜索结果中获得最喜欢的推文?
- windows - 关闭管道会使 DLL 的标准输出句柄无效
- spring-boot - 如何通过在 spring-boot 中从 bootstrap.yml 中获取名称来在 log4j2 中记录应用程序名称?