輸入
sum_possible(2017, [4, 2, 10]) # -> False
使用anywhich 導致解決方案掛起/需要很長時間
def sum_possible(amount, numbers, cache = None):
if cache is None:
cache = {}
if amount in cache:
return cache[amount]
if amount == 0:
return True
if amount < 0:
return False
cache[amount] = any([sum_possible(amount - number, numbers, cache) for number in numbers])
return cache[amount]
使用for回圈在合理的時間內解決解決方案
def sum_possible(amount, numbers, cache = None):
if cache is None:
cache = {}
if amount in cache:
return cache[amount]
if amount == 0:
return True
if amount < 0:
return False
for number in numbers:
if sum_possible(amount - number, numbers, cache):
cache[amount] = True
return True
cache[amount] = False
return False
我以為any會短路?有效的return True早期荷蘭國際集團,如果它遇到了True?
uj5u.com熱心網友回復:
any()會短路,但您正在構建一個串列以any首先傳遞給它。
cache[amount] = any([sum_possible(amount - number, numbers, cache) for number in numbers])
串列理解首先被評估 - 它是急切的:
[sum_possible(amount - number, numbers, cache) for number in numbers]
用生成器運算式替換它 - 這應該可以作業(懶惰的評估):
cache[amount] = any(sum_possible(amount - number, numbers, cache) for number in numbers)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344891.html
上一篇:如何在APL中進行相互遞回?
下一篇:找到解決方案/回傳后如何停止遞回
