取决于一个参数的未确定的for循环数

时间:2014-05-27 17:46:00

标签: python for-loop recursion nested-loops

我正在尝试执行以下操作:函数接收两个数字n和d,其中n是循环迭代次数,d是一个参数,用于确定循环限制的方式,即对数字数组执行某些操作[a_1,...,a_n]对于所有正a_1,...,a_n,使得它们总和为d。例如,如果n = 4,它应该执行以下操作:

for i in range (0,d+1):
    for j in range(0,d+1-i):
        for k in range(0,d+1-i-j):
            doSomething([i, j, k, d-i-j-k])

我从this question收集并从几年前的编程知识中收集到这应该通过递归函数来完成。不幸的是,我不太明白我应该如何传递参数(我几年没有编程,我有点生疏)。

2 个答案:

答案 0 :(得分:2)

你当然可以使用递归,但你也可以使用itertools(https://docs.python.org/2/library/itertools.html):

import itertools

def call_on_sum_permutations(callable, n, d):
    for a in itertools.product(range(d+1),repeat=n):
        if sum(a) == d:
            callable(a)

def pr(x):
    print(x)

call_on_sum_permutations(pr, 3, 10)

对于大n来说,这可能会变得笨拙

(另请注意,您的描述显示a_1到a_n为正,但您的代码允许为零,所以我也这样做。您可能还会发现查看itertools.permutations,itertools.combinbin和其他模块中的其他内容)< / p>

答案 1 :(得分:2)

这是一个递归解决方案:

def drill(f, n, d, items=()):
    if n > 1:
        for i in range(d+1):
            drill(f, n-1, d-i, items+(i,))
    else:
        f(list(items) + [d])

......这样叫:

>>> def p(x): print x
...
>>> drill(p, 3, 4)
[0, 0, 4]
[0, 1, 3]
[0, 2, 2]
[0, 3, 1]
[0, 4, 0]
[1, 0, 3]
[1, 1, 2]
[1, 2, 1]
[1, 3, 0]
[2, 0, 2]
[2, 1, 1]
[2, 2, 0]
[3, 0, 1]
[3, 1, 0]
[4, 0, 0]