python - 不理解这个递归的python代码

标签 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 的值似乎如何在循环内部的某处发生变化并且始终为正数,即使它总是插入,真的很困惑

 target - candidates[i]

递归函数内部

最佳答案

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

intermedia 然后在 target 仍然大于或等于 candidate[i] 时累积另一个 candidate。累积发生在这一行的末尾:self.DFS(candidates,target-candidates[i],i,result,intermedia+[candidates[i]])

同时,对于此特定调用,target 会减少,以表示我们已使用候选人来尝试达到目标号码。这样当 target==0 时,我们就准备好 result.append(intermedia) 了,也就是这个特定的候选积累。 for 循环在每次调用中生成一组全新的具有不同候选者的递归调用。

关于python - 不理解这个递归的python代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163089/

相关文章:

javascript - React 递归遍历嵌套对象

javascript - 使用递归数组递归组件加载

c - 如何使用递归获取 C 中文件夹的总大小?

python - Django:在 JSON 字符串中包含相关模型?

java - Boyer-Moore 多数表决算法的内存复杂度?

c++ - 按照每对权重之和的顺序,高效地计算两个加权集合中的对

c++ - 给定开始值、结束值和增量值,我想要一个向上和向下计数的算法

python - 我可以将参数添加到 python 属性以减少代码重复吗?

python - 如何从 Github 工作流程访问环境 secret ?

python - 将变量与 txt 中的行匹配并删除行时出现问题