你得到一个数字n。使用递归编写程序,该递归找到总和等于n的数字的所有可能组合。例如x1 + x2 + x3 + x4 + x5 + ... + etc = n,其中x1> = x2> = x3> = x4> =等。
Example input:
5
Example output:
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
答案 0 :(得分:0)
这是解决这个问题的一种方法。它虽然效率非常低(为价值远远高于10而挣扎)并且也不依赖于递归,所以你应该把它作为一个参考,你可以开发出更好的解决方案。
import itertools
def generate_sum_sequences(n):
smaller_values = list(range(1, n+1))
def get_all_combinations():
for i in smaller_values:
yield from itertools.combinations_with_replacement(reversed(smaller_values), i)
for c in get_all_combinations():
if sum(c) == n:
yield c
if __name__ == '__main__':
n = 5
for sum_sequence in generate_sum_sequences(n):
print('{}={}'.format(n, '+'.join([str(x) for x in sum_sequence])))
<强>输出强>
5=5
5=4+1
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
答案 1 :(得分:0)
def gen_combinations(n, limit=-1):
if n < 1:
yield []
return
if n == 1:
yield [1]
return
if limit == -1:
limit = n
for first in range(min(limit, n), 0, -1):
for seq in gen_combinations(n - first, first):
yield [first] + seq
def main():
n = 40
for seq in gen_combinations(n):
print("%d=%s" % (n, "+".join(map(str, seq))))
这应该有效,但处理数字> 50
时存在一些性能问题。