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即可。 

');