我试图准确理解这个递归函数是如何工作的。我知道它需要两个列表并交错它们。有人可以启发我关于函数的嵌套部分吗?
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:])
答案 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']
我认为以这种方式很容易理解......