【问题标题】:A question about recursive programming in python关于python中递归编程的一个问题
【发布时间】:2021-11-01 01:17:19
【问题描述】:

我正在尝试在python中实现一个递归函数,让我们调用这样的函数F,这样的函数的输入是一个列表,我们称之为aF的实现逻辑应该如下,

def F(a):
    if this is first time I run this function (in other words if this is not the first time I run this function, leave a as it is):
        a.reverse()
    then do something recursively calling F

我想问一下,实现这一目标的最简单方法是什么。 python真的支持这样的逻辑吗?

【问题讨论】:

  • 你要么创建一个包装函数来调用F,然后先做你需要做的事情,或者像F(a, first_time=False)这样的事情,然后通过F(a, True)调用它
  • @Sayse Wrapper 解决方案更简洁,它避免了在每次递归调用中评估 first_time。包装器是一次性设置问题或数据清理(如边界检查)的良好解决方案。
  • 您好,谢谢您的评论。我不希望函数中有任何额外的变量。那么在这种情况下,你能详细说明一下你所说的包装函数是什么意思吗?
  • 你在做任何你需要的预设后调用def Fx() 调用F
  • @pjs - 是的,假设您处于可以轻松重构以引入包装器功能的位置,后者适用于情况并非如此的时候

标签: python recursion


【解决方案1】:

您可以将 root 输入到您的函数中:

def F(a:list,radical = 0):
    old_a = a.copy()
    if radical == 0:
        a.reverse()
    # do sometihing ......
    return F(old_a,radical + 1)

【讨论】:

  • 可能是一个解决方案,但我不希望函数中有任何额外的变量。
【解决方案2】:

你可以试试这样的

def F(a):
    F.counter += 1
    print(F.counter)
    if F.counter == 1:
       a.reverse() 
    F(a)
F.counter = 0
F(a)

您无需定义全局变量或任何其他

【讨论】:

  • 与使用简单的包装器相比,这看起来非常昂贵。
  • 很不幸,这种方法似乎不起作用。 currentframe不接受任何输入。
  • @CoolGas 很抱歉我改变了我的方法。试试这个会有效,与其他相比,这并不昂贵
【解决方案3】:

通常,您将 F 封装成一个单独的递归辅助函数。

def F(a):
    def helper(a):
        "Do recursive stuff"

    a.reverse()
    return helper(a)

如果由于某种原因,每次调用 F 时重新定义 _F_helper 的成本过高,您可以在 F 之外定义它:

def _F_helper(a):
    "Do recursive stuff"

def F(a):
    a.reverse()
    return _F_helper(a)

这两种方法的好处是您无需花费大量时间来决定是否应该调用a.reverse()。它被无条件地调用一次,然后然后你继续递归。

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2015-01-13
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多