【问题标题】:Recursive functions递归函数
【发布时间】:2023-04-02 03:39:01
【问题描述】:

假设我有一个在列表中创建列表的递归函数。它返回类似于以下内容的内容:

['a', ['b', ['c', ['d', []]]], 'z', []]

让我们将此列表称为 LIST1

然后我有一个函数来获取该列表,并为我清理它,基本上删除 z。让我们将此列表称为 LIST2

[a,b,c,d]

我可以做的是调用我的第一个函数并接收我的列表,然后(在 python shell 中)调用我在 LIST1 上的清理函数以将其转换为 LIST2。我想做的是在返回 LIST1 后立即进行清理操作,本质上是在我的列表生成器函数中进行清理操作。

我很困惑我应该如何调用一个函数来改变递归函数的结果而不搞砸递归函数。

我不想详细介绍我的代码,因为它相当复杂且嵌套程度很高,但如果您希望我澄清一下,请提出问题。

如果它有助于将问题可视化,请用更简单的术语来想象它。我有一个返回值的函数,我希望另一个函数对该值进行操作,但在第一个函数内。

干杯,

【问题讨论】:

    标签: python list function recursion


    【解决方案1】:

    这是你想要做的吗?

    import collections
    
    result = ['a', ['b', ['c', ['d', []]]], 'z', []]
    
    def get_result() :
        for r in result :
            yield r
    
    
    def flatten(l):
        for el in l:
            if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
                for sub in flatten(el):
                    yield sub
            else:
                yield el
    
    
    def remove_z(l) :
        for i in l :
            if i != 'z' :
                yield i
    
    print [ l for l in remove_z(flatten(get_result()))]
    

    结果是

    ['a', 'b', 'c', 'd']
    

    'flatten' 功能来自这里:https://stackoverflow.com/a/2158532/16718

    【讨论】:

      【解决方案2】:

      我可能遗漏了一些东西,但为什么不对递归函数的最终结果调用清理函数呢?例如

      result = cleanup(recursive())
      

      【讨论】:

      • 我试过 return cleanup(resultlist) 但我什么也没得到。
      • 我很抱歉,如果它含糊不清,但我被批评为我的函数嵌套有多差,我想知道在另一个函数的返回值上调用另一个函数的一般概念是什么,在后一个函数。
      • 保留未清理版本的递归。只调用一次cleanup,在 python 提示符下,@Daniel 向您展示的方式。
      • PS 如果你想避免含糊其辞,最好的办法是贴一些代码。
      【解决方案3】:

      除非您提供有关递归函数和清理函数的更多详细信息,否则很难解决您的问题

      尽管如此,我设计了一个可能与您目前正在做的类似的简单示例。如您所见,正如@Daniel 所提到的,嵌套调用确实可以正常工作

      这是一个例子

      给定

      >>> def Wind(p):
          if not p:
              return []
          return [p[:1] + Wind(p[1:-1])+p[-1:]]
      
      >>> Wind(range(1,10))
      [[1, [2, [3, [4, [5, 5], 6], 7], 8], 9]]
      

      >>> def UnWind(p):
          if not p:
              return []
          return p[:1] + UnWind(p[1:-1][0])+p[-1:]
      

      这样您就可以在 Wind 运行良好后看到 UnWind 的结果。

      >>> UnWind(Wind(range(1,10))[0])
      [1, 2, 3, 4, 5, 5, 6, 7, 8, 9]
      

      【讨论】:

      • 好的,这是一个完美的例子。我将如何强制风在风中调用 unwind。
      猜你喜欢
      • 2015-03-01
      • 2010-12-23
      • 1970-01-01
      • 2010-12-25
      • 2016-01-06
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多