总和的递归实现目标 Python
recursive implementation of sum to target Python
我有以下方法,给定一个目标整数,生成从有序的整数行创建该整数的所有方法,条件是列索引(从一个开始)乘以数字总和每行的目标。
下面是实现此目的的一些代码。
target = 7
for x in range(math.floor(target/4)+1):
for f in range(math.floor((target-4)/3)+1):
for t in range(math.floor((target-4*x-3*f)/2)+1):
s = target - 2*t - 3*f - 4*x
print(s,t,f,x)
7 0 0 0
5 1 0 0
3 2 0 0
1 3 0 0
4 0 1 0
2 1 1 0
0 2 1 0
3 0 0 1
1 1 0 1
0 0 1 1
请注意,所有行的总和为 target=7
,即取最下面的行 0*1 + 0*2 + 1*3 + 1*4=7
。
在一般情况下,我不知道我需要多少列。例如,我可能只是
target = 7
for t in range(math.floor(target/2)+1):
s = target - 2*t
print(s,t)
或者实际上,还有更多 for
循环。
我如何概括这一点,最有可能基于递归解决方案,以便列数成为参数?
这是一个递归的解决方案。您只需 运行 通过最后一列的选项,然后使用剩余的列获取剩余的组合。
def gencombos( target, column ):
if column == 1:
yield [target]
else:
for i in range( 0, target//column+1 ):
for row in gencombos( target-i*column, column-1 ):
yield row+[i]
for row in gencombos( 7, 4 ):
print(row)
输出:
[7, 0, 0, 0]
[5, 1, 0, 0]
[3, 2, 0, 0]
[1, 3, 0, 0]
[4, 0, 1, 0]
[2, 1, 1, 0]
[0, 2, 1, 0]
[1, 0, 2, 0]
[3, 0, 0, 1]
[1, 1, 0, 1]
[0, 0, 1, 1]
您可以将其更改为对 (7,6) 的调用以查看差异。
我有以下方法,给定一个目标整数,生成从有序的整数行创建该整数的所有方法,条件是列索引(从一个开始)乘以数字总和每行的目标。
下面是实现此目的的一些代码。
target = 7
for x in range(math.floor(target/4)+1):
for f in range(math.floor((target-4)/3)+1):
for t in range(math.floor((target-4*x-3*f)/2)+1):
s = target - 2*t - 3*f - 4*x
print(s,t,f,x)
7 0 0 0
5 1 0 0
3 2 0 0
1 3 0 0
4 0 1 0
2 1 1 0
0 2 1 0
3 0 0 1
1 1 0 1
0 0 1 1
请注意,所有行的总和为 target=7
,即取最下面的行 0*1 + 0*2 + 1*3 + 1*4=7
。
在一般情况下,我不知道我需要多少列。例如,我可能只是
target = 7
for t in range(math.floor(target/2)+1):
s = target - 2*t
print(s,t)
或者实际上,还有更多 for
循环。
我如何概括这一点,最有可能基于递归解决方案,以便列数成为参数?
这是一个递归的解决方案。您只需 运行 通过最后一列的选项,然后使用剩余的列获取剩余的组合。
def gencombos( target, column ):
if column == 1:
yield [target]
else:
for i in range( 0, target//column+1 ):
for row in gencombos( target-i*column, column-1 ):
yield row+[i]
for row in gencombos( 7, 4 ):
print(row)
输出:
[7, 0, 0, 0]
[5, 1, 0, 0]
[3, 2, 0, 0]
[1, 3, 0, 0]
[4, 0, 1, 0]
[2, 1, 1, 0]
[0, 2, 1, 0]
[1, 0, 2, 0]
[3, 0, 0, 1]
[1, 1, 0, 1]
[0, 0, 1, 1]
您可以将其更改为对 (7,6) 的调用以查看差异。