簡體   English   中英

不了解此遞歸python代碼

[英]Not understanding this recursive python code

我最近試圖找出有關代碼爭用問題的答案。 我最終找到了可從以下網站使用的解決方案: https : //statyang.wordpresults.com/python-practice-51-combination-sum/

但是,無論我執行多少打印語句或調試,我似乎都無法弄清楚

target

正在改變價值的某個地方

if target < candidates[i]:
    return

該程序的全部目的是輸入一個數組(包括重復項),並輸出加總到目標的總和的不同組合。

這是所有調試打印語句的代碼

class Solution2:
# @param candidates, a list of integers
# @param target, integer
# @return a list of lists of integers
def combinationSum(self, candidates, target):
    candidates.sort()
    result=[]
    self.DFS(candidates,target,0,result,[])
    return result

def DFS(self,candidates,target,start,result,intermedia):
    print "===== inside DFS method ============="
    print "candidates {0}".format(candidates)
    print "target: {0}".format(target)
    print "start {0}".format(start)
    print "result {0}".format(result)
    print "intermedia {0}".format(intermedia)
    if target==0:
        print ">>> inside if target==0"
        print "target==0 appending {0}".format(intermedia)
        result.append(intermedia)
        return
    for i in range(start,len(candidates)):
        print "=====inside for loop ========: i= {0}".format(i)
        print "target={0}, cadidates[i]={1}".format(target, candidates[i])
        if target<candidates[i]:
            print ">>> target < candidates[i] {0} < {1}".format(target, candidates[i])
            print "i before return {0}".format(i)
            return
        print "i after return {0}".format(i)
        print "======== preparing for recursion ========:"
        print "candidates {0}".format(candidates)
        print "new target: target - candidates[i]: {0} - {1} = {2}".format(target, candidates[i], target-candidates[i])
        print "new start: {0}".format(i)
        print "result {0}".format(result)
        print "new intermedia: intermedia + candidates[i]: {0} + {1} = {2}".format(intermedia, [candidates[i]], intermedia + [candidates[i]])
        print "i= {0} start= {1}".format(i, start)
        print "about to call recursion again!"
        self.DFS(candidates,target-candidates[i],i,result,intermedia+[candidates[i]])

test2=Solution2()
print(test2.combinationSum([2, 4, 6, 8], 8))

這是結束輸出

[[2, 2, 2, 2], [2, 2, 4], [2, 6], [4, 4], [8]]

如您所見,這些對中的每對加起來為8

對於目標值似乎如何在循環內的某個位置變化並始終變為正數(即使它總是插入)感到非常困惑

 target - candidates[i]

遞歸函數內部

遞歸從此調用self.DFS(candidates,target,0,result,[]) ,其中參數intermedia是一個空數組。

然后,只要target仍大於或等於candidate[i] intermedia就會累積另一個candidate 累積發生在此行的末尾: self.DFS(candidates,target-candidates[i],i,result,intermedia+[candidates[i]])

同時,針對此特定呼叫降低了target ,以表示我們已使用候選人來嘗試達到目標數量。 因此,當target==0 ,我們准備好result.append(intermedia) ,這是候選人的這種特殊積累。 for循環在每個調用中生成一組具有不同候選者的全新遞歸調用集。

目標僅通過此行上的遞歸調用進行更改:

self.DFS(候選人,目標候選人[i],i,結果,中間媒體+ [候選人[i]])

總是肯定的,因為程序在進行遞歸調用之前會執行以下檢查:

  if target<candidates[i]: ... return 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM