找到达到给定总和的所有数字组合

时间:2017-01-14 18:01:03

标签: arrays recursion

你得到一个数字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 

2 个答案:

答案 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时存在一些性能问题。