繁体   English   中英

如何在 Python 中创建递归平方根?

[英]How can I make a recursive square root in Python?

我有这个代码:

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

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

看起来您正在尝试实现用于计算平方根的除法算法(不过我真的不知道); 不过,我不确定您为什么要使用内置的幂运算符 (**),但您不应该这样做。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM