Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python数组加法递归_Python_Arrays_Recursion - Fatal编程技术网

Python数组加法递归

Python数组加法递归,python,arrays,recursion,Python,Arrays,Recursion,所以我在做coderbyte的挑战,我有一个问题: ArrayAdditionI,这是问题的陈述: ''' 使用Python语言,让函数ArrayAdditionI(arr)获取存储在arr中的数字数组 如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true, 否则返回字符串false。 例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。 数组不会为空,不会包含所有相同的元素,并且可能包含负数。 ''' 因为我做不到,我研究了一

所以我在做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”。

好的,下面是调用。子调用相对于其父调用缩进:

  • 调用
    countFor([4,6,10,1,3],23,0)
    • 如果
    • 如果
      • 如果
      • 如果
        • 如果
        • 如果
      • 如果

关键点是
countFor
中的第二个递归调用不是在
elif
中-它本身就是一个
if
,因此在我们返回调用堆栈后,第二个递归调用也可能发生。

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

[]23 24中,让我们遵循以下逻辑:

if sw == m:
没有。。。那是24对23

if countFor(ar, m, sw):
这将生成您的[]23 24行。 由于数组有0个元素,因此调用立即返回False

if countFor(ar, m, s0):
这将生成您的[]23 21行。同样,空数组会立即得到一个False

if countFor(ar, m, s0):
我们再掉一行,返回一个False到上一个调用


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

if countFor([3], 23, 21):
其中,21是sw的值。我们转到第二个电话,有s0的那个。此时,s0为20,因此调用如下所示:

if countFor([3], 23, 20):
。。。这个调用看到20+3=23=m,所以它返回True

if countFor(ar, m, s0):
这对你来说清楚了吗