Python数组加法递归
所以我在做coderbyte的挑战,我有一个问题: ArrayAdditionI,这是问题的陈述: ''' 使用Python语言,让函数ArrayAdditionI(arr)获取存储在arr中的数字数组 如果数组中的任何数字组合相加等于数组中的最大数字,则返回字符串true, 否则返回字符串false。 例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4+6+10+3=23。 数组不会为空,不会包含所有相同的元素,并且可能包含负数。 ''' 因为我做不到,我研究了一个解决方案,我发现: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。 数组不会为空,不会包含所有相同的元素,并且可能包含负数。 ''' 因为我做不到,我研究了一
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):
这对你来说清楚了吗