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
。
答案 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)