0

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

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:])
4

3 回答 3

1

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

因此,给定一个 list [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]
于 2014-03-14T08:52:11.457 回答
0

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

现在已经澄清了,您应该会看到另一个函数: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]
于 2014-03-14T09:04:04.827 回答
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']

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

于 2014-03-14T09:04:15.453 回答