例题:采用牛顿法求平方根 给定一个正数x,如何计算x的平方根呢? 牛顿的逐步逼近法 对于x的平方根,给定一个猜测值y,则y与x/y的平均值是比y更好的一个猜测值,继续这一过程,会得到越来越好的猜测值。 如何用过程语言表述这一计算过程? 初始条件:给定 x 和 猜测值 guess sqrt(guess,x){ if(goodEnough(guess,x)) return guess; return sqrt(improve(guess,x),x); } goodEnough(guess,x){ if(abs(guess*guess-x)<threshold) return true; return false; } Improve(guess,x){ return (guess+x/guess)/2; } 这个例子体现了 可以通过一个过程递归的方法得到越来越好的猜测值; 可以把过程抽象成一个个的黑箱,来完成不同的操作,过程的抽象一方面隐蔽了一些细节,使求解的过程更清晰,另一方面可以通过局部的修改改进整个求值过程的功能; 例如,通过修改goodEnough里面的threshold就可以改变求解的精度,而不必修改其它部分。 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值: (x/y2+2y)/3 请利用这一公式实现一个类似平方根过程的求立方根的过程。 代码: #include<stdio.h> #include <math.h> float fun(float guess,float x) { if(abs(guess*guess*guess-x)<0.0000001) return guess; else return fun((x/guess/guess+2*guess)/3,x); } int main() { float a,b; while(scanf("%f%f",&a,&b)) printf("%f\n",fun(a,b)); }

评论