document.write('
以数值4为例,和为4的所有的整数组合一定都小于4(1,2,3,4)。首先选择数字1,然后用递归的方法求和为3(4-1)的组合,一直递归下去直到用递归求和为0的组合的时候,所选的数字序列就是一个和为4的数字组合。然后第二次选择2,接着用递归求和为2(4-2)的组合;同理下一次选3,然后用递归求和为1(4-3)的所有组合。依此类推,直到找出所有的组合为止,实现代码如下:
"""
方法功能: 求和为sums的所有整数组合
输入参数: sums正整数, result存储组合结果, count记录组合中数字的个数
"""
def getAllCombination(sums,result,count):
if sums<0:
return
#数字的组合满足和为sums的条件,打印出所有组合
if sums==0:
prrnt "满足条件的组合:".
i=0
while i<count:
print result[i],
i+=1
print \'\\n\'
return
#打印debug信息, 为了便于理解
print "----当前组合:",
i=0
while i<count:
print str(result[i]),
i+=1
print "----"
#确定组合中下一个取值
i=(1 if count==0 else result[count-1])
print "---"+"i="+str(i)+"count="+str(count)+"---" #打印debug信息, 为了便于理解
while i<=sums:
result[count]=i
count+=1
getAllCombination(sums-i,result,count)# 求和为sums-i的组合
count-=1 #递归完成后, 去掉最后一个组合的数字
i+=1 #找下一个数字作为组合中的数字
#方法功能: 找出和为n的所有整数的组合
def showAllCombination(n):
if n<1:
print "参数不满足要求"
return
result=[None]*n# 存储和为n的组合方式
getAllCombination(n, result,0)
if __name__=="__main__":
showAllCombination(4)
程序的运行结果为:
----当前组合: ----
---i=1 count=0---
----当前组合: 1----
---i=1 count=1---
----当前组合: 1 1----
---i=1 count=2---
----当前组合: 1 1 1----
---i=1 count=3---
满足条件的组合: 1 1 1 1
满足条件的组合: 1 1 2
----当前组合: 1 2----
---i=2 count=2---
满足条件的组合: 1 3
----当前组合: 2----
---i=2 count=1---
满足条件的组合: 22
----当前组合: 3----
----i=3 count=1---
满足条件的组合: 4
运行结果分析:
从上面运行结果可以看出,满足条件的组合为:{1,1,1,1},{1,1,2},{1,3},{2,2},{4},其他的为调试信息。从打印出的信息可以看出:在求和为4的组合中,第一步选择了1;然后求3(4-1)的组合也选了1,求2(3-1)的组合的第一步也选择了1,依次类推,找出第一个组合为{1,1,1,1}。然后通过count-和i+找出最后两个数字1与1的另外一种组合2,最后三个数字的另外一种组合3;接下来用同样的方法分别选择2,3作为组合的第一个数字,就可以得到以上结果。
代码i=(count==0 ? 1 : result[count-1]); 用来保证:组合中的下一个数字一定不会小于前一个数字,从而保证了组合的递增性。如果不要求递增(例如把{1,1,2}和{2,1,1}看作两种组合),那么把上面一行代码改成i=1即可。
');