【发布时间】:2011-04-09 00:47:20
【问题描述】:
我想系统地生成字母表的排列。 我不能不想使用 python itertools.permutation,因为预先生成每个排列的列表会导致我的计算机崩溃(我第一次真正让它强制关机,非常棒)。
因此,我的新方法是动态生成和测试每个密钥。目前,我正在尝试通过递归来处理这个问题。
我的想法是从最大的列表开始(我将使用 3 个元素的列表作为示例),递归到较小的列表,直到列表有两个元素长。然后,它将打印列表,交换最后两个,再次打印列表,然后返回上一级并重复。
例如,对于 123
123(将位置 0 与位置 0 交换)
23 --> 123 (swap position 1 with position 1) 32 --> 132 (swap position 1 with position 2)213(将位置 0 与位置 1 交换)
13 --> 213 (swap position 1 with position 1) 31 --> 231 (swap position 1 with position 2)321(将位置 0 与位置 2 交换)
21 --> 321 (swap position 1 with position 1) 12 --> 312 (swap position 1 with position 2)
对于四字母数字 (1234)
1234(将位置 0 与位置 0 交换)
234 (swap position 1 with position 1) 34 --> 1234 43 --> 1243 324 (swap position 1 with position 2) 24 --> 1324 42 --> 1342 432 (swap position 1 with position 3) 32 --> 1432 23 --> 14232134(将位置 0 交换为位置 1) 134(将位置 1 与位置 1 交换) 34 --> 2134 43 --> 2143 314(将位置 1 与位置 2 交换) 14--> 2314 41--> 2341 431(将位置 1 与位置 3 交换) 31--> 2431 13 -->2413
这是我目前用于递归的代码,但它让我很伤心,递归不是我的强项。这就是我所拥有的。
def perm(x, y, key):
print "Perm called: X=",x,", Y=",y,", key=",key
while (x<y):
print "\tLooping Inward"
print "\t", x," ",y," ", key
x=x+1
key=perm(x, y, key)
swap(x,y,key)
print "\tAfter 'swap':",x," ",y," ", key, "\n"
print "\nFull Depth Reached"
#print key, " SWAPPED:? ",swap(x,y,key)
print swap(x, y, key)
print " X=",x,", Y=",y,", key=",key
return key
def swap(x, y, key):
v=key[x]
key[x]=key[y]
key[y]=v
return key
任何帮助将不胜感激,这是一个非常酷的项目,我不想放弃它。
谢谢大家!欢迎对我的方法或任何内容发表评论。
【问题讨论】:
-
首先,除非您做错了,否则 itertools 不会预先生成列表。其次,它是坏了还是你只是想要更好的代码?如果您正在寻找更好的代码,您只需在 codereview.stackexchange.com 上发布代码以供审核
-
我会在那里修改和转发,谢谢
-
第二温斯顿·尤尔特;
itertools.permutations不会预先生成所有排列,据我所知,这正是您所需要的。也许您尝试执行诸如打印所有结果之类的操作,或者将它们粘贴在一个列表中,这导致它必须全部生成它们才能满足请求? -
只有在可行的情况下才这样做。该站点用于改进工作代码而不是修复损坏的代码。从您的帖子中我不清楚代码是否损坏。如果是,您需要在此网站上明确说明它与您的预期有何不同。
标签: python recursion generator permutation