在做這個 LeetCode 問題時,我注意到性能有很大差異,具體取決于我決定撰寫的版本(參見注釋部分)。其中一個更簡潔,但我看不出應該有區別的原因。一個解釋將不勝感激。
class Solution:
def rec_memo(self, nums, index, curr_sum, target, memo):
if curr_sum == target:
return True
elif curr_sum > target or index == len(nums):
return False
if (index, curr_sum) in memo:
return memo[(index, curr_sum)]
# This line (below) is significantly more efficient
# memo[(index, curr_sum)] = self.rec_memo(nums, index 1, curr_sum nums[index], target, memo) or self.rec_memo(nums, index 1, curr_sum, target, memo)
# These lines (below) are significantly less efficient
# choose_num = self.rec_memo(nums, index 1, curr_sum nums[index], target, memo)
# not_choose_num = self.rec_memo(nums, index 1, curr_sum, target, memo)
# memo[(index, curr_sum)] = choose_num or not_choose_num
return memo[(index, curr_sum)]
def canPartition(self, nums: List[int]) -> bool:
sum = 0
for i in range(0, len(nums), 1):
sum = nums[i]
if sum % 2 != 0:
return False
memo = {}
return self.rec_memo(nums, 0, 0, sum // 2, memo)
uj5u.com熱心網友回復:
第一個:
self.rec_memo(nums, index 1, curr_sum nums[index], target, memo) or \
self.rec_memo(nums, index 1, curr_sum, target, memo)
由于短路評估self.rec_memo(),如果第一個回傳,則不會評估后一個呼叫。True
但是,對于第二個:
choose_num = self.rec_memo(nums, index 1, curr_sum nums[index], target, memo)
not_choose_num = self.rec_memo(nums, index 1, curr_sum, target, memo)
memo[(index, curr_sum)] = choose_num or not_choose_num
無論第一次呼叫rec_memo(). 您觀察到的減速可能是這些額外遞回呼叫的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431325.html
上一篇:##[error]denied:將docker鏡像推送到AWSECR時未授權
下一篇:使用遞回解決子集和問題
