这种交错递归函数如何工作?

时间:2014-03-14 08:50:23

标签: python list function recursion nested-function

我试图准确理解这个递归函数是如何工作的。我知道它需要两个列表并交错它们。有人可以启发我关于函数的嵌套部分吗?

def interleave(lst):
    def interleaveHelper(lst1,lst2):
        if not lst1:
            return lst2
        elif not lst2:
            return lst1
        return lst1[0:1] + interleaveHelper(lst2, lst1[1:])
    return interleaveHelper(lst[:len(lst)/2], lst[len(lst)/2:])

3 个答案:

答案 0 :(得分:1)

递归嵌套函数只接受第一个参数的第一个元素,然后交换递归调用的参数(减去第一个元素)。

所以给定一个列表[1, 2, 3, 4],外部调用将列表拆分为两个,然后递归:

([1, 2], [3, 4]) -> [1] + ([3, 4], [2])
    ([3, 4], [2]) -> [3] + ([2], [4])
        ([2], [4]) -> [2] + ([4], [])
            ([4], []) -> return [4]  # lst2 is empty, return lst1
        return [2] + [4]
    return [3] + [2, 4]
return [1] + [3, 2, 4]

答案 1 :(得分:0)

嗯,实际上已经定义了两个不同的东西并在这里使用。 interleaveHelper将从 first 列表中获取第一个元素,然后递归地应用相同的函数,但交换列表。这意味着,下一次调用它将取出第二个列表的第一个元素。

现在澄清了这一点,你应该看到另一个功能:interleave。此函数采用一个列表并通过切片将其拆分为一半(参见最后一行)(例如,lst[:len(lst)/2]是前半部分)。然后它需要两半并交错它们。

这意味着该功能将以与您洗牌相似的方式对项目进行随机播放:分成两半并逐个混合。 : - )

一个简单的例子是:

In [2]: a = range(10)

In [3]: interleave(a)
Out[3]: [0, 5, 1, 6, 2, 7, 3, 8, 4, 9]

答案 2 :(得分:0)

交错函数实际上是interleaveHelper(l1, l2)。假设您有2个列表l1=[1,2,3]和另一个l2=['a', 'b', 'c', 'd', 'e']作为示例。为简洁起见,我们也可以致电interleaveHelper(l1, l2) = f(l1,l2)。然后,最后一行将给出:

f([1,2,3], ['a', 'b', 'c', 'd']) = [1] + f(['a', 'b', 'c', 'd'], [2,3])
                                 = [1] + ['a'] + f([2,3], ['b', 'c', 'd']) 
                                 = [1, 'a'] + f([2,3], ['b', 'c', 'd'])
                                 = [1, 'a'] + [2] + f(['b', 'c', 'd'], [3])
                                 = [1, 'a', 2] + f(['b', 'c', 'd'], [3])
                                 = [1, 'a', 2] + ['b'] + f([3], ['c', 'd'])
                                 = [1, 'a', 2, 'b'] + f([3], ['c', 'd'])
                                 = [1, 'a', 2, 'b'] + [3] + f(['c', 'd'], [])
                                 = [1, 'a', 2, 'b', 3] + f(['c', 'd'], [])
                                 = [1, 'a', 2, 'b', 3] + ['c', 'd']
                                 = [1, 'a', 2, 'b', 3, 'c', 'd']

我认为以这种方式很容易理解......