Java 使用递归的平方根(牛顿算法)
有人能给我解释一下这个求一个数的平方根的递归伪代码吗?我发现很难理解,因为我没有给出n、p和e输入代表什么。谢谢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)
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))
希望这有帮助
Brucen是您想要平方根的数字,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似乎是对算法精度的容忍度这说明得更好: