2016-07-07 48 views
2

所以我在做coderbyte的挑战,我有问题之一: ArrayAdditionI,这里的问题的声明:Python的阵列加入递归

“”” 使用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”。

回答

2

好的 - 这里是电话。孩子叫缩进相对于他们的父母:

  • 呼叫countFor([4, 6, 10, 1, 3], 23, 0)
    • 呼叫countFor([6, 10, 1, 3], 23, 4)从第一if
    • 呼叫countFor([10, 1, 3], 23, 10)从第一if
      • 呼叫countFor([1, 3], 23, 20)从第一if
      • Ca LL countFor([3], 23, 21)从第一if
        • 呼叫countFor([], 23, 24)从第一if
        • 呼叫countFor([], 23, 21)从第二if
      • 呼叫countFor([3], 23, 20)从第二if

关键是countFor中的第二次递归调用不在elif中 - 它本身就是if,所以在我们恢复调用堆栈之后,还会发生第二次递归调用。

0

您尚未追踪所有逻辑,只是例程顶部的输入和更新。

[] 23 24,让我们遵循的逻辑:

if sw == m: 

都能跟得上......这是24 VS 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): 

...和这个调用看到的是20 + 3 = 23 = M,所以它返回

这是否为您澄清事情?