【问题标题】:divide list using recursion使用递归划分列表
【发布时间】:2014-06-22 05:16:23
【问题描述】:

我正在尝试使用递归来实现这个函数,该函数接受一个函数参数 f,当传递一个值时,它将返回 true 或 false。它应该检查列表中的所有值,并将所有真值存储在一个列表中,将假值存储在另一个列表中,并以元组的形式返回它们。

def divL(f, l):

     if not l:
          return ([],[])


     else:
          a = list()
          b = list()
          for i in range(len(l)):

               if f(l[i]):
                    a.append(l[i])

               else:
                    b.append(l[i])

          return (a, b)

【问题讨论】:

  • ...问题是? ...
  • 这个问题本质上似乎不是递归的;你为什么要这么做?
  • @HughBothwell 所有的 CS 问题本质上都是递归的,尤其是在大一时:)

标签: python recursion


【解决方案1】:

要递归解决这个问题,那么你可以从:

def div_l(fn, elements):
    if not elements:
        return ([], [])
    else:
        trues, falses = div_l(fn, elements[1:])
        if fn(elements[0]):
            trues.append(elements[0])
        else:
            falses.append(elements[0])
        return (trues, falses)

关于您的代码需要注意的一点是,目前没有递归调用。在上面的代码中,我们的基本情况是元素列表为空 (if not elements)。然后,我们不断检查列表的第一个元素,看它是否满足fn,并将其适当地附加到truesfalses。然后我们将列表中除第一个 (elements[1:]) 之外的所有元素再次传递给函数并重复直到列表为空。

话虽如此,问题似乎本质上不是递归的。为什么不直接使用list comprehensions

a = [element for element in l if f(element)]
b = [element for element in l if not f(element)]

此外,ablf 这样的名称也不是很好,因为它们没有说明它们的实际含义。

关于到目前为止您编写代码的方式,Pythonic 遍历列表元素的方式与 C/C++/Java/等语言不同;您应该很少需要使用它们的索引来获取列表项。相反,您可以重写您的for statement,如下所示:

for element in l:
   if f(element):
        a.append(element)

   else:
        b.append(element)

附:上面的代码我还没有测试过,不过应该是一个合理的起点。

【讨论】:

  • 除非这不是递归的。因此,上面的 cmets 要求澄清。
【解决方案2】:

递归版本。

但我同意其他人的观点,最好不要递归。

def divL(f, l):

    if not l:
        return ([],[])
    else:
        a, b = divL(f,l[1:])

        if f(l[0]):
            a.insert(0, l[0])
        else:
            b.insert(0, l[0])

        return (a, b)

#-- test ---

def f(x): return x > 0

divL(f,[1,-2,3,4,2,-5])

([1, 3, 4, 2], [-2, -5])

【讨论】:

    【解决方案3】:

    以拆分列表为参数的递归函数:

    def _R(f, l, ts, fs):
      if not l:
        return ts, fs
      if f(l[0]):
        return _R(f, l[1:], ts + l[:1], fs)
      return _R(f, l[1:], ts, fs + l[:1])
    
    def R(f, l):
      return _R(f, l, [], [])
    
    print R( lambda x: x > 10, range(20) )
    

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2011-05-10
      • 2014-04-13
      相关资源
      最近更新 更多