我在做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
然后我就能理解到底发生了什么,直到最后三个循环,我都不知道是哪部分代码让它从“Input:[] 23 24”改为“输入:[] 23 21”改为“输入:[3] 23 20”。
3条答案
按热度按时间guz6ccqo1#
好了,下面是调用。儿童调用相对于其父母缩进:
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
,所以当我们回到调用堆栈后,第二个递归调用也可能发生。wwtsj6pe2#
您还没有跟踪所有的逻辑,只是例程顶部的输入和更新。
在**[] 23 24**,让我们遵循逻辑:
不...是24对23 ...
这将生成您的**[] 23 24行。由于数组有0个元素,调用将立即返回False**。
这将生成**[] 23 21行。同样,空数组立即得到False**。
我们再掉一行,并返回一个False到前一个调用。
生成此调用的调用是第一个countFor,调用时带有
其中,21是sw的值。我们转到第二个调用,即s0的调用。此时,s0为20,因此调用如下所示:
...并且 this 调用看到20+3 = 23 = m,所以它返回True。
你明白了吗?
bbuxkriu3#
只需使用包
itertools.combinations
: