我正在尝试执行以下操作:函数接收两个数字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收集并从几年前的编程知识中收集到这应该通过递归函数来完成。不幸的是,我不太明白我应该如何传递参数(我几年没有编程,我有点生疏)。
答案 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]