# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第7章 排列组合与概率 7.3 如何求正整数n所有可能的整数组合
题目:
给定一个正整数n,求解出所有和为n的整数组合,要求组合按照递增方式展示,而且唯一。
例如:
4=1+1+1+1、1+1+2、1+3、2+2、4(4+0)
分析:
所求的是所有组合,我记得应该是用回溯算法。
回溯算法的主要思想是:
成功,打印
设置变量
递归
清除变量
对于此题,这里的递归处理应该怎么算
c(n)=c(1) + c(n-1)
c(n-1) = c(1) + c(n-2)
...
c(2) = c(1) + c1(1)
但是这带来一个问题,就是c(2)会被表示为1+1
而不会出现直接为2的情况,因为会一直分解
或者我可以找出2的所有表示方式:
2=1+1,2
那这个应该如何返回。
关键:
1 书上解法
可以用
comb(sums, result, count)
来做递归,sums表示剩余待表达的整数,result是结果列表,count
# 确定组合中下一个取值的起始范围,确保组合中下一个数字一定不会小于前一个数字
i = 1 if 0 == count else result[count-1]
# i最多可以取到sums
while i <= sums:
# 设置变量
result[count] = i
count += 1
# 递归
comb(sums - i, result, count)
# 清除变量
count -= 1
# 找下一个数字做为组合中的数字
i += 1
2 没有想到
回溯的一种算法式采用累减的方式,减为0,则表示成功。
另外的确需要尝试在一个位置上摆放多个元素,
每次摆放完成,计算下一次递归结果,然后清除当前摆放
然后选择下一次摆放的元素
参考:
Python程序员面试算法宝典
'''
def printResult(result, count):
if n