检查列表中的目标产品(递归)

时间:2016-11-20 22:09:03

标签: python python-3.x recursion

def can_make_product(p, vals):
    if len(vals)==1:
       if p==vals[0]:
           return True
       else:
           return False

    for i in range(len(vals)):
       for k in range(i,len(vals)):

           if vals[i] * vals[k]==p:
               return True

    return False    

p是我在列表vals中寻找的产品。但是,上面的代码一次仅适用于2个数字的倍数,而不适用于所有可能的子集。使用递归有更简单的方法吗? 例如,给定p=81和列表[2, 2, 3, 3, 4, 9]3×3×9=81,它应返回true

1 个答案:

答案 0 :(得分:1)

这应该有效:

def can_make_product(p, vals):
    # base case empty list: n**0 == 1 for all n
    try:
        head, tail = vals[0], vals[1:]
    except IndexError:
        return p == 1
    # recursive step: try tail of vals with/without head
    if not p % head and can_make_product(p//head, tail):
        return True
    return can_make_product(p, tail)