不理解这个递归的python代码

时间:2017-04-01 23:30:21

标签: python algorithm recursion depth-first-search

我最近试图找出关于代码争斗问题的答案。我最终找到了一个适用于本网站的解决方案: 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]

在递归函数内部

2 个答案:

答案 0 :(得分:1)

递归从这个调用self.DFS(candidates,target,0,result,[])开始,其中参数intermedia是一个空数组。

只要intermedia仍然大于或等于candidate

target就会积累另一个candidate[i]。积累发生在这一行的末尾:self.DFS(candidates,target-candidates[i],i,result,intermedia+[candidates[i]])

同时,target对于此特定通话减少,表示我们已尝试使用该候选人尝试达到目标数字。因此,当target==0时,我们已准备好result.append(intermedia),这是候选人的特殊积累。 for循环在每个调用中生成一组具有不同候选的全新递归调用。

答案 1 :(得分:0)

目标仅通过此行上的递归调用进行更改:

  

self.DFS(候选目标候选[I],I,结果,中间+ [候选[I]])

它始终是正面的,因为程序在进行递归调用之前会进行此检查:

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