Java 使用递归的平方根(牛顿算法)

Java 使用递归的平方根(牛顿算法),java,recursion,square-root,Java,Recursion,Square Root,有人能给我解释一下这个求一个数的平方根的递归伪代码吗?我发现很难理解,因为我没有给出n、p和e输入代表什么。谢谢 if abs(e^2 - n) < p SR(n,p,e) = e else SR(n,p,e) = SR(n,p,(e+n/e)/2) (e begins at n) 如果abs(e^2-n)

有人能给我解释一下这个求一个数的平方根的递归伪代码吗?我发现很难理解,因为我没有给出n、p和e输入代表什么。谢谢

if abs(e^2 - n) < p
    SR(n,p,e) = e     
else
    SR(n,p,e) = SR(n,p,(e+n/e)/2)

(e begins at n)
如果abs(e^2-n)

n是您想要平方根的数字,e是平方根的估计值,p是您想要的精度,即您愿意容忍的误差。算法说:如果e与答案“足够接近”,即e^2在p与n之间,那么e就是你要寻找的答案;否则,请尝试更好的估计(e+n/e)2。为什么这是一个更好的估计?如果e大于sqrt(n),那么n/e将小于sqrt(n),因此sqrt(n)将介于e和n/e之间,因此尝试将e和n/e的平均值作为下一个估计值。(反之亦然,如果e小于sqrt(n))

希望这有帮助


Bruce

n是您想要平方根的数字,e是平方根的估计值,p是您想要的精度,即您愿意容忍的误差。算法说:如果e与答案“足够接近”,即e^2在p与n之间,那么e就是你要寻找的答案;否则,请尝试更好的估计(e+n/e)2。为什么这是一个更好的估计?如果e大于sqrt(n),那么n/e将小于sqrt(n),因此sqrt(n)将介于e和n/e之间,因此尝试将e和n/e的平均值作为下一个估计值。(反之亦然,如果e小于sqrt(n))

希望这有帮助


布鲁斯

牛顿的算法不仅仅是从一个估计值到一个“更好的估计值”,还有更多的东西。有一些详细的数学背后为什么更好的估计是什么

这个想法是,为了找到形式为
f(x)=0
的任何方程的解(除了少数例外情况),如果你有一个
x
的近似值,你可以通过查看
f(x)
的变化率得到一个更好的近似值,这通常被写成
f'(x)
,用它来计算出你需要调整估计的程度,从而更好地估计出真正的解决方案

在平方根的情况下,也就是说,我们想要找到
x=sqrt(n)
,我们可以写
f(x)=x^2-n
f'(x)=2x
,然后使用牛顿算法找到正确的
x
,使
f(x)=0
。这意味着,如果我们有一个估计值
e
,那么为了计算下一个估计值,我们看
f(e)=e^2-n
,然后我们问我们需要改变多少才能消除这个错误。由于
f
的变化率是
f'(x)
,即
2e
(e,e^2-n)
点处的变化率,我们应该将
e^2-n
除以
2e
,计算出我们需要调整
e
多少,以得到下一个估计值

也就是说,我们的下一个估计应该是

  e - (e^2-n) / 2e
= e - (e / 2)  + (n / 2e)
= (e + n / e) / 2
有关牛顿算法的更多信息,请访问
(它有一个可爱的图表来解释它是如何工作的)并在这里讨论了一些更技术性的细节。

牛顿的算法不仅仅是从一个估计值到一个“更好的估计值”。有一些详细的数学背后为什么更好的估计是什么

这个想法是,为了找到形式为
f(x)=0
的任何方程的解(除了少数例外情况),如果你有一个
x
的近似值,你可以通过查看
f(x)
的变化率得到一个更好的近似值,这通常被写成
f'(x)
,用它来计算出你需要调整估计的程度,从而更好地估计出真正的解决方案

在平方根的情况下,也就是说,我们想要找到
x=sqrt(n)
,我们可以写
f(x)=x^2-n
f'(x)=2x
,然后使用牛顿算法找到正确的
x
,使
f(x)=0
。这意味着,如果我们有一个估计值
e
,那么为了计算下一个估计值,我们看
f(e)=e^2-n
,然后我们问我们需要改变多少才能消除这个错误。由于
f
的变化率是
f'(x)
,即
2e
(e,e^2-n)
点处的变化率,我们应该将
e^2-n
除以
2e
,计算出我们需要调整
e
多少,以得到下一个估计值

也就是说,我们的下一个估计应该是

  e - (e^2-n) / 2e
= e - (e / 2)  + (n / 2e)
= (e + n / e) / 2
有关牛顿算法的更多信息,请访问
(它有一个可爱的图表,解释了它是如何工作的)并在这里讨论了一些更技术性的细节。

p似乎是对算法精度的容忍度这说明得更好:p似乎是对算法精度的容忍度这说明得更好: