算法总结之手搓开平方 | 青训营

133 阅读2分钟

前言

这也是一道来自leetcode的题目,要求我们在不使用各个语言内置sqrt()函数的情况下对一个数开平方根,最后的结果向下取整。刚开始我对这道题目只能说是毫无思路了,后来还是评论区大神给我指了一条明路。这道题本质上是一个数学题。

leetcode原题

这个链接是leetcode的原题: leetcode.com/problems/sq…
这道题的Level是Easy,这其实是因为找到数学方法之后这道题的代码非常好写。

Newton's Method

这道题的解法就是这个部分的标题,Newton's Method。
牛顿法,也被称为牛顿-拉弗森方法。这个方法其实也被用于机器学习中对参数的优化,速度快过常用的梯度下降法,但是也有一些限制。
牛顿法可以用来求当f(x)=0f(x) = 0xx的值。
它的基本公式长这个样子:

x1=x0f(x0)f(x0)x_1 = x_0 - \frac{f(x_0)}{f'(x_0)}

当然,这是经过推导的公式,推导过程大家可以自行搜索。
我们的任务就是找出一个f(x)f(x)来使用这个公式。
根据题目,我们要做的是求解一个rr,作为x\sqrt{x}的解,由此可得x=r\sqrt{x} = r
如果我们给两边同时平方,就可得x=r2x = r^2,我们接下来再变换一下xx的位置就可得r2x=0r^2 - x = 0
这时,我们的f(r)f(r)就是r2xr^2 - x,我们要做的就是求得f(r)=r2x=0f(r) = r^2 - x = 0xx的值。

首先我们要先求得f(r)f'(r)
根据我们上面的公式易得f(r)=2rf'(r) = 2r
随后将f(r)f'(r)f(r)f(r)带入我们上面的牛顿公式,就可得下列等式:

rn+1=rnrn2x2rnr_{n+1} = r_n - \frac{r_n^2 - x}{2r_n}

我们随后将右边的分式进行变换可得:

rn+1=rnrn2+x2rnr_{n+1} = r_n - \frac{r_n}{2} + \frac{x}{2r_n}

再对式子进行整理就可得最终公式:

rn+1=rn+xrn2r_{n+1} = \frac{r_n + \frac{x}{r_n}}{2}

最后一步就是将这个公式用代码写出来,可以使用迭代循环来写。由于我们每次求得r都是向下取整,所以我们的判断循环终止的条件就是当r*r = 0时。