从递归返回值

时间:2021-06-21 08:41:51

标签: python recursion stack

我正在学习 hereAll unique combinations whose sum equals to K 教程。我需要修改程序以返回找到的第一个唯一组合。

所以我修改了代码以返回一个 final 数组,我也在 combination_rec 中传递了它。在调试代码时,我看到 final 的状态没有在递归堆栈中维护,我得到 [] 作为返回值。

import copy

def combination(arr, sum):
    arr.sort(reverse=False)
    local = []
    res = combination_rec(0, 0, sum, local, arr, [])
    if res:
        return res
    return []

def combination_rec(length, total, sum, local, arr, final):
    if total == sum:
        final = copy.copy(local)
        return final

    for i in range(length, len(arr), 1):

        if total + arr[i] > sum:
            continue

        if (i > length and arr[i] == arr[i - 1]):
            continue

        local.append(arr[i])

        final = combination_rec(i + 1, total + arr[i], sum, local, arr, final)

        local.remove(local[len(local) - 1])
        
        return final


if __name__ == "__main__":
    combination([6, 5, 4, 3], 8)
Expected Output
--------
[3,5]
Actual Output
--------
[]

课程概要

  1. 对数组进行排序 - [3, 4, 4, 5, 6]
  2. 循环遍历其元素以检查每个可能的元素组合,其总和为 K (8)
  3. 以 3 开始。检查子数组 [3, 4] 的总数是否为 8。它没有。 因此它修改子数组以包含 [3, 4, 5]。由于这总数 (12) > 8
  4. 返回到第 local.remove(local[len(local) - 1]) 行,从子数组中删除 5 并继续考虑排序数组中的后续元素
  5. 检查 [3,4,6]。
  6. 删除 6,然后删除 4。
  7. 接下来检查 [3, 5]。这与总数相匹配,这是我希望将 final 返回为 [3, 5]

我做错了什么?

PS: 我知道第 4 步 - 后续的 for 循环迭代 - 是多余的。当 [3,4,5] 产生的总和大于它时,检查 [3,4,6] 是没有意义的。但这不是我关心的问题。我试图理解递归的返回值

0 个答案:

没有答案