【问题标题】:Python Array Addition recursionPython数组加法递归
【发布时间】:2026-01-17 03:40:01
【问题描述】:

所以我在做 coderbyte 的挑战,但我遇到了一个问题: ArrayAdditionI,问题说明如下:

''' 使用 Python 语言,让函数 ArrayAdditionI(arr) 获取存储在 arr 中的数字数组 如果数组中的任何数字组合可以加起来等于数组中的最大数字,则返回字符串 true, 否则返回字符串 false。 例如:如果 arr 包含 [4, 6, 23, 10, 1, 3],则输出应返回 true,因为 4 + 6 + 10 + 3 = 23。 数组不会为空,不会包含所有相同的元素,并且可能包含负数。 '''

由于我做不到,我研究了一个解决方案,我发现了这个:

def countFor(arr, m, s0):
  if len(arr) == 0:
    return False
  a0 = arr[0]
  ar = arr[1:]

  sw = s0 + a0
  if sw == m:
    return True
  if countFor(ar, m, sw):
    return True
  if countFor(ar, m, s0):
    return True
  return False

def ArrayAdditionI(arr): 

  m = max(arr)
  arr.remove(m)
  return str(countFor(arr, m, 0)).lower()

现在,我试图了解代码在每个循环中的确切作用,我打印了此列表 [4, 6, 23, 10, 1, 3] 的每个循环的输出:

Input:  [4, 6, 10, 1, 3] 23 0
a0:  4
ar:  [6, 10, 1, 3]
sw:  4
Input:  [6, 10, 1, 3] 23 4
a0:  6
ar:  [10, 1, 3]
sw:  10
Input:  [10, 1, 3] 23 10
a0:  10
ar:  [1, 3]
sw:  20
Input:  [1, 3] 23 20
a0:  1
ar:  [3]
sw:  21
Input:  [3] 23 21
a0:  3
ar:  []
sw:  24
Input:  [] 23 24
Input:  [] 23 21
Input:  [3] 23 20
a0:  3
ar:  []
sw:  23
True

我跟随并理解发生了什么,直到最后三个循环,我不知道代码的哪一部分使它从“输入:[] 23 24”变为“输入:[] 23 21”到“输入:[3] 23 20"。

【问题讨论】:

    标签: python arrays recursion


    【解决方案1】:

    好的 - 这里是电话。子调用相对于父调用缩进:

    • 致电countFor([4, 6, 10, 1, 3], 23, 0)
      • 从第一个if拨打countFor([6, 10, 1, 3], 23, 4)
      • 从第一个if拨打countFor([10, 1, 3], 23, 10)
        • 从第一个if拨打countFor([1, 3], 23, 20)
        • 从第一个if拨打countFor([3], 23, 21)
          • 从第一个if拨打countFor([], 23, 24)
          • 从第二个if拨打countFor([], 23, 21)
        • 从第二个if拨打countFor([3], 23, 20)

    关键是countFor 中的第二个递归调用不在elif - 它本身就是一个if,所以当我们回到调用堆栈后,第二个递归调用可以也会发生。

    【讨论】:

      【解决方案2】:

      您还没有跟踪所有的逻辑,只是例程顶部的输入和更新。

      [] 23 24,让我们按照逻辑:

      if sw == m:
      

      不……那是 24 对 23……

      if countFor(ar, m, sw):
      

      这会产生您的 [] 23 24 行。 由于数组有 0 个元素,调用立即返回 False

      if countFor(ar, m, s0):
      

      这会产生您的 [] 23 21 行。同样,空数组立即获得 False

      我们又掉了一行,然后返回 False 到上一次调用。


      产生这个的调用是第一个 countFor,调用与

      if countFor([3], 23, 21):
      

      其中 21 是 sw 的值。我们转到第二个调用,即带有 s0 的调用。此时 s0 为 20,所以调用如下:

      if countFor([3], 23, 20):
      

      ... this 调用看到 20+3 = 23 = m,所以它返回 True

      这对你有帮助吗?

      【讨论】: