问答题 3.  给定一个正整数n,求解出所有和为n的整数组合,要求组合按照递增方式展示,而且唯一。例如:4=1+1+1+1、1+1+2、1+3、2+2、4(4+0)。
【正确答案】以数值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即可。
【答案解析】

[考点] 如何求正整数n所有可能的整数组合。