【问题标题】:How can I make a recursive square root in Python?如何在 Python 中创建递归平方根?
【发布时间】:2013-04-14 22:29:14
【问题描述】:

我有这个代码:

def root(x,n):    
    if n==0:
        return x
    else:
        return 0.5**(x/root(x,n-1)+root(x,n-1))

但是:

>>>root(4,2)
>>>2.05

为什么? 而且它不适用于其他平方根...

【问题讨论】:

  • 你的指数在错误的一边,应该是:(x/root(x,n-1)+root(x,n-1))**0.5
  • 也许你应该指定你正在使用的算法而不是让我们猜测;)
  • 但是 root(1234,2) 给了我 8.3819....
  • 我不明白你想让代码做什么。 n 应该代表什么?

标签: python recursion square-root


【解决方案1】:

看起来您正在尝试实现divided differences 算法来计算平方根(不过我无法确定);不过,我不确定您为什么在此使用内置的幂运算符 (**) - 您不应该这样做。

递归平方根的基本策略是猜测平方根,检查猜测的准确性,如果旧的猜测不够准确,则创建一个新的猜测,然后继续递归,直到猜测足够接近真正的根返回。

为了控制结果的准确性(以及递归的深度),我们需要能够对照实际的平方根来检查我们的猜测;我们可以通过对其进行平方并将其与我们找到的非常小的平方根数之间的差异来做到这一点。

def goodEnough(guess, x):
    return abs((x - (guess * guess))) <= .01 #change this value to make the function more or less accurate

为了真正找到平方根,我们需要一种更好的猜测方法;这就是算法的用武之地。我选择使用Newton's method,因为它相当简单。

def newGuess(guess, x):
    return (guess + guess/x)/2

现在我们可以把它们放在一起了:

def root(guess, x):
    if goodEnough(guess, x):
        return guess
    else:
        return root(newGuess(guess, x), x)

我们可以多一步消除guess参数:

def sqrt(x):
    return root(x/2, x) #x/2 is usually somewhat close to the square root of a number

【讨论】:

    【解决方案2】:

    它确实有效,唯一的问题是递归调用的数量越高,即在这种情况下,你的结果应该越准确,因为计算中的错误减少了,还确保你包括当 n == 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多