我有以下方法,給定一個目標整數,生成從整數的有序行創建該整數的所有方法,條件是列索引(從一個開始)乘以數字總和到每行的目標.
下面是一些實作這一點的代碼。
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回圈。
我如何概括這一點,很可能基于遞回解決方案,以便列數是一個引數?
uj5u.com熱心網友回復:
這是一個遞回解決方案。您只需瀏覽最后一列的選項,然后使用剩余的列獲取剩余內容的組合。
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) 以查看差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383333.html
下一篇:遞回步驟不更新輸出
