我在python中寫了兩個不同的遞回函式來解決以下問題。我寫的第二個函式作業正常,并回傳正確的結果;但我寫的第一個函式卻回傳錯誤的結果。這兩個函式的唯一區別是基礎條件。請你向我解釋一下為什么第一個函式會回傳錯誤的結果?
問題陳述:
你得到了一個整數陣列
nums和一個整數target。你想從nums中建立一個運算式,通過添加一個符號 ' '和'-'中的一個符號,然后將所有的整數連接起來。 整數。例如,如果
nums = [2, 1],你可以在2前面加一個' ',在1前面加一個'-' 并將它們連接起來以建立運算式 " 2-1"。回傳你可以建立的不同運算式的數量,其中 評估為目標。
我的代碼:
# 第一個函式:回傳錯誤的結果。
def targetsum(nums, crnt, target)。
print(nums,crnt)
if target==crnt:
return 1
if len(nums)==0。
return 0: return
結果 = (
targetsum(nums[1:], crnt nums[0] , target)
targetsum(nums[1:], crnt - nums[0, target)
)
return result
# 第二個函式:回傳正確的結果。
def dfs(curr, nums, target) 。
print(nums,curr)
if not nums。
return (1 if Curr == target else 0)
res = (
dfs(curr nums[0], nums[1:], target)
dfs(curr - nums[0], nums[1:], target)
)
return res
nums = [1,1,1,1]
target=3]。
crnt=0] crnt=0
print(targetum(nums, crnt, target)) # prints 4
print(dfs(crnt, nums, target)) # prints 5
我期望輸出5,因為有5種分配符號的方法來使nums的總和成為目標3:
-1 1 1 1 1 = 3
1 - 1 1 1 = 3
1 1 -1 1 =3
1 1 1 -1 1 =3
1 1 1 1 -1 =3
第二個函式,dfs,按照預期回傳5。但第一個函式,targetsum,回傳4,這是錯誤的。為什么?
uj5u.com熱心網友回復:
在你的第一個函式targetsum中,遞回的基例是錯誤的。如果crnt == target,函式targetsum立即回傳1,即使我們還沒有達到陣列的末端。但這是錯誤的:你應該在到達陣列的末端時才回傳一個結果。
在你的例子中,nums=[1,1,1,1]和target=3,第一個遞回呼叫將這樣進行:
1 1 1 1 1 Crnt=0
1 1 1 1 Crnt=1
1 1 1 1 1 crnt= 2
1 1 1 1 1 crnt=3
crnt==3==target! return 1立刻!
你能看到這里的邏輯錯誤嗎?crnt等于目標,是的,但是我們忘記了考慮到陣列中的最后兩個數字。我們不應該立即回傳1;事實上,以 1 1 1開頭的目標不是1而是2種可能性:這兩種可能性是 1 1 1和 1 1 1。但要弄清楚這一點的唯一方法是深入到遞回中去。我們還沒有碰到一個基本的案例。
你的第二個函式dfs正確地處理了基本情況:條件if not nums:意味著 "如果nums為空:"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/319339.html
標籤:
下一篇:如何將"如果資料陣列中的第三個元素不是空白,則顯示表格;如果不是,則回傳空白"翻譯成GoogleAppsScriptJavascript?
