因此,使用itertools模块,我可以编写一段代码,用于生成所有具有替换的排列,但我想要做的事情是使用递归。在python中替换置换的递归函数算法
这就是我想出了:
def permutations_with_replacement(n,k,permutations):
m = 0
if k < 1:
return permutations
for i in range(27):
permutations[i].append(m % n)
if (i % n**(k-1)) == n**(k-1) - 1:
m = m + 1
return permutations_with_replacement(n,k-1,permutations)
n = 3
k = 3
permutations = [[] for i in range(n**k)]
print permutations_with_replacement(n,k,permutations)
基本上它有点奠定每个排列的第一层(入口),然后在每个后续迭代它贯穿0,...,N-1快并更快地获得所有组合。我举了一个n = k = 3的例子,因为我必须初始化置换列表,并在函数内部初始化它会导致事件在递归时被搞砸。我还将范围设置为27而不是n^k,因为在递归时n^k也会被搞乱。这怎么能够干净地工作?
我真正想做的是做一个递归,基本上取代了用替换生成所有排列的嵌套for-loop方法,我的理解是递归解决了嵌套for-loop方法需要知道深度的问题先验地嵌套for循环。所以如果有人能告诉我如何做到这一点,那也会很好,谢谢。
如果你改变'k == 0'返回'[[]]',你不需要'k == 1'的特殊情况。 –
谢谢!!!我实际上正在研究如何摆脱这种特殊情况的年龄:)并且那里它一直在我面前。但是,有趣的是,发现它需要思考整个事物是如何以不同的方式工作的......我坚持认为它的基础都是在k = 1时生成n个值!好一个! – GreenAsJade