牛顿逐步逼进法求平方根(schema, SICP)

计算机如何算出平方根呢?最常用的就是牛顿的逐步逼进方法。这个方法就是:如果对x的平方根的值有一个猜测值y,那么就可以通过执行一个简单的操作去得到一个更好的猜测:只需要求出y和x/y的平均值(它更接近实际的平方根值)。例如,可以用这种方式去计算2的平方根,假定初始值是1:
猜想       商          平均值
1               2/1=2              (2+1)/2 = 1.5
1.5             2/1.5=1.3333       (1.3333+1.5)/2 = 1.4167
1.4167          2/1.4167=1.4118    (1.4167+1.4118)/2=1.4142
1.4142          ...                             ...
继续这一计算过程,我们就能得到对2的平方根的越来越好的近似值。
我们可以将这一基本策略写成下面的过程(schema):
(define  (sqrt-iter  guess  x)
      (if  (good-enough?  guess  x)
            guess
            (sqrt-iter  (improve  guess  x)
                        x)))
改进猜测的方法就是求出它与被开方数除以上一个猜测的平均值:
(define  (improve  guess  x)
       (average  guess  (/  x  guess)))  
其中:
(define (average  x  y)
       (/  (+  x   y)  2))
我们还必须说明什么叫做”足够好“,下面的做法想法是:不断改进答案直至它足够接近平均值,使得其平方与被平方数之差小于某个事先确定的误差值(这里是0.001):
(define  (good-enough ? guess  x)
        (<  (abs  (-(square guess)  x)) 0.001))
其中:
(define (square)  x)
      (*  x  x))
最后提供一个启动方法:
(define (sqrt  x)
      (sqrt-iter  1.0 x))
那么把这个定义都送给解释器,我们就可以使用sqrt,就像可以使用其他过程一样:

(sqrt 9)
3.00009155413138

 

(sqrt (+ 100 37))
11.704699917758145

 

(square (sqrt 1000))
1000.000369924366

 

 这个过程也显示函数式运算思维与命令式的区别,这里是自顶向下的解决问题思路,而我们常用的命令式思维则要考虑如何指挥机器从底部一步一步的堆积出论证,最后达到我们的目标,是自底向上。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛顿迭代是一种用于求解方程的数值方,其中包括求平方根。在C++中,可以使用以下步骤来实现牛顿迭代求平方根: 1. 首先,选择一个初始猜测值作为平方根的近似值。 2. 使用牛顿迭代公式进行迭代计算,直到满足预设的精度要求为止。 3. 牛顿迭代公式为:x = (x + n / x) / 2,其中x是当前的近似值,n是待求平方根的数。 4. 重复步骤3,直到满足预设的精度要求。可以通过设置一个误差范围或者迭代次数来控制迭代的停止条件。 下面是一个使用牛顿迭代求平方根的C++代码示例: ```cpp #include <iostream> #include <cmath> double sqrtNewton(double n, double x0, double epsilon, int maxIterations) { double x = x0; int iterations = 0; while (iterations < maxIterations) { double fx = x * x - n; // 计算函数值 double fpx = 2 * x; // 计算导数值 if (std::abs(fx) < epsilon) { // 判断是否满足精度要求 break; } x = x - fx / fpx; // 更新近似值 iterations++; } return x; } int main() { double n = 16; // 待求平方根的数 double x0 = 1; // 初始猜测值 double epsilon = 0.0001; // 精度要求 int maxIterations = 100; // 最大迭代次数 double result = sqrtNewton(n, x0, epsilon, maxIterations); std::cout << "平方根的近似值为:" << result << std::endl; return 0; } ``` 在上述代码中,我们定义了一个`sqrtNewton`函数来实现牛顿迭代求平方根。在`main`函数中,我们设置了待求平方根的数`n`、初始猜测值`x0`、精度要求`epsilon`和最大迭代次数`maxIterations`,然后调用`sqrtNewton`函数来计算平方根的近似值,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值