【问题标题】:Simple recursion function in pythonpython中的简单递归函数
【发布时间】:2021-11-28 18:40:02
【问题描述】:

对编码非常陌生,尤其是函数。我正在尝试创建一个递归函数,它从n == 1 开始,将n 除以二,然后继续将下一个数字除以二。数学方法是fn = fn-1/2。代码如下

def half(n):
    return half(n/2)
half(1)

但我不断收到“超出最大递归深度”

请帮忙?

【问题讨论】:

  • 递归函数需要某种基本情况,因此您不会永远递归调用该函数。这应该什么时候停止?连续跳水 2 的极限是零,但你永远不会到达那里(见Zeno's paradox)。
  • half() 调用half() 调用half() 等等,直到永远。您需要在代码中设置一个返回实际值的条件,而不是再次递归调用自身。
  • 你也许应该先在纸上设计这样的东西,然后考虑一下,然后再把它写成代码;如果你把它写在纸上,很明显它永远不会结束。它将永远像half(1)half(0.5)half(0.25)half(0.125)half(0.0625) 等等(理论上,实际上它会达到最大递归深度)。为什么不呢?
  • 是的,这是有道理的。教授给我的指示并没有警告这将是 python 中的一个问题。我设置了一个条件,一旦 n

标签: python function recursion


【解决方案1】:

您在 Python 中遇到了递归限制。如果 Python 没有在最大递归深度处停止,您的函数将导致无限递归。

【讨论】:

  • 无限递归几乎会导致您的计算机崩溃,因为 cpu 和 ram 的使用最终会超过所有限制(而且很快)
【解决方案2】:

递归需要设置限制,不能显示无限 类似于 if n>0.00001: return half(n/2) else return n

【讨论】:

  • 制作n>.0001的条件,谢谢
【解决方案3】:

您可以用与数学公式几乎相同的方式定义函数,但您需要一些方法来停止递归(即不需要递归即可获得答案的基本情况)。

例如,如果已知 f(0) 的结果为 1,那么这是基本情况,您无需再次调用函数即可返回答案:

def f(n):
    if n==0: return 1         # base case f(0) --> 1 (stops recursion)
    else:    return f(n-1)/2  # recursion fn=fn-1/2

print(f(10)) # 0.0009765625   # this happens to be 1/2^10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2015-05-27
    • 2011-05-05
    相关资源
    最近更新 更多