📜  不使用sqrt()函数的数字的平方根(1)

📅  最后修改于: 2023-12-03 15:06:12.008000             🧑  作者: Mango

不使用sqrt()函数的数字的平方根

很多程序员都知道如何使用sqrt()函数来计算数字的平方根,但有时候我们需要在不使用该函数的情况下实现相同的功能。把它作为一种挑战可以增强我们的编程技巧。在本文中,我们将介绍两种方法来计算数字的平方根,而不使用sqrt()函数。

牛顿迭代法

牛顿迭代法是一种求解方程的数值方法。它也可以用于计算数字的平方根。该方法的思路是:假设已经知道一个近似值x,那么就可以用x来近似目标平方根的值sqrt(s)。这样,可以将问题转化为求解方程x^2 - s = 0。牛顿迭代法利用该方程的导数来逼近x的解,也就是说,通过对方程进行线性近似来获得新的估计值,直到达到所需的精度为止。

def my_sqrt(s: float) -> float:
    x = s
    y = (x + s/x) / 2
    while abs(y - x) > 1e-9: # 设定精度为1e-9
        x = y
        y = (x + s/x) / 2
    return x

上面的代码使用了一个while循环,直到y和x的差小于1e-9时停止迭代。将初始估计值设为s,这种方法的时间和空间复杂度均为O(1)。

二分法

另一种不使用sqrt()函数的方法是二分法。该方法的思路是:如果s的平方根大于等于x,则目标值在[0,s]之间;否则,目标值在[s, max(s,1)]之间(max(s,1)是为了防止s=0时出错)。使用二分法可以将范围逐渐缩小,最终得出正确答案。

def my_sqrt(s: float) -> float:
    if s < 1.0:
        left, right = s, 1.0
    else:
        left, right = 1.0, s
    while abs(right - left) > 1e-9: # 设定精度为1e-9
        mid = (left + right) / 2
        if mid ** 2 > s:
            right = mid
        else:
            left = mid
    return left

上面的代码使用了if/else语句来决定搜索的范围。注意,当s小于1时,需要将搜索范围倒过来。这种方法的时间和空间复杂度均为O(1)。

以上是两种不使用sqrt()函数的方法来计算数字的平方根。无论是哪种方法,都需要仔细思考并合理设计代码。这些方法旨在帮助读者更好地理解数值方法的概念,增强编程技巧。