代码之家  ›  专栏  ›  技术社区  ›  David Meléndez

python分解接收数字的数字函数和分解方法

  •  2
  • David Meléndez  · 技术社区  · 6 年前

    我试图创建一个函数,它分解一个只有给定数字的数字:

    例如,要分解的数字是5,分解的方法是1,2,5

    def func(Number_to_decompose,list_with posible_ways_to_decompose)
    func(5,[1,2,5])
    

    所以函数应该返回:

    [[1,1,1,1,1],[2,1,1,1],[1,2,1,1],[1,1,2,1],[1,1,1,2],[5]]
    

    考虑到清单中的数字正在增加 所以[1+1+1+2]是5!

    2 回复  |  直到 6 年前
        1
  •  1
  •   oli5679    6 年前

    这是一个非常自然的递归公式:

    from copy import copy
    def recurse_find(decomposed,remaining,valid_numbers):
        #base case
        if remaining == 0:
            return decomposed
        #find all valid subtractions
        else:
            ans = []
            for number in valid_numbers:
                if remaining - number >= 0:
                    new_decomposed = copy(decomposed)
                    new_decomposed.append(number)
                    cand = recurse_find(new_decomposed,remaining- 
                                  number,valid_numbers)
                    if cand:
                        ans.append(cand)
            if len(ans) > 0:
                return ans
    

    print(recurse_find([],5,[1,2,5]))-->与您请求的输出匹配。

        2
  •  1
  •   U13-Forward    6 年前

    试用使用 itertools.product 对于列表理解中的不同重复,则在列表理解之外进行检查:

    import itertools
    def func(n,l):
       return [a for i in [itertools.product(l,repeat=x) for x in range(1,6)] for a in i if sum(a) == n]
    
    print(func(5,[1,2,5]))
    

    输出:

    [(5,), (1, 2, 2), (2, 1, 2), (2, 2, 1), (1, 1, 1, 2), (1, 1, 2, 1), (1, 2, 1, 1), (2, 1, 1, 1), (1, 1, 1, 1, 1)]
    

    如果需要列表:

    print(list(map(list,func(5,[1,2,5]))))
    

    输出:

    [[5], [1, 2, 2], [2, 1, 2], [2, 2, 1], [1, 1, 1, 2], [1, 1, 2, 1], [1, 2, 1, 1], [2, 1, 1, 1], [1, 1, 1, 1, 1]]