【问题标题】:How does this interleaving recursive function work?这个交错递归函数是如何工作的?
【发布时间】:2014-03-14 08:50:23
【问题描述】:

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

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

【问题讨论】:

  • 你试过执行它并看到结果吗?

标签: python list function recursion nested-function


【解决方案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]

【讨论】:

    【解决方案2】:

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

    现在已经澄清了,您应该看到另一个函数: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]
    

    【讨论】:

      【解决方案3】:

      交错功能真的是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']
      

      我觉得这样很容易理解……

      【讨论】:

        猜你喜欢
        • 2016-11-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 2020-08-18
        相关资源
        最近更新 更多