I am a teacher!

导航

迭代(一):迭代算法的基本思想

      迭代法也称辗转法,是一种不断用变量的旧值推出新值的过程。它是解决问题的一种基本方法,通过让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

      迭代算法的基本思想是:为求一个问题的解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过程直到|x1-x0|<ε(某一给定的精度)。此时可将x1作为问题的解x。

      利用迭代算法解决问题,需要做好以下三个方面的工作:

      (1)确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值推出新值的变量,这个变量就是迭代变量。

      (2)建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键。

      (3)对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

      迭代也是用循环结构实现,只不过要重复的操作是不断从一个变量的旧值出发计算它的新值。其基本格式描述如下:

迭代变量赋初值;

while (迭代终止条件)

{

      根据迭代表达式,由旧值计算出新值;

      新值取代旧值,为下一次迭代做准备;

}

【例1】验证谷角猜想

      日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数 n ,若 n 为偶数,则将其除以 2 ;若 n 为奇数,则将其乘以 3 ,然后再加 1 。如此经过有限次运算后,总可以得到自然数 1 。人们把谷角静夫的这一发现叫做“谷角猜想”。

      要求:编写一个程序,由键盘输入一个自然数 n ,把 n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

      (1)编程思路

      定义迭代变量为n,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当 n 为偶数时,n=n/2 ;当 n 为奇数时, n=n*3+1 。

      这就是需要计算机重复执行的迭代过程。这个迭代过程需要重复执行多少次,才能使迭代变量 n 最终变成自然数 1 ,这是我们无法计算出来的。因此,还需进一步确定用来结束迭代过程的条件。由于对任意给定的一个自然数 n ,只要经过有限次运算后,能够得到自然数 1 ,从而完成验证工作。因此,用来结束迭代过程的条件可以定义为: n==1 。

(2)源程序

#include <iostream>

using namespace std;

int main()

{

   unsigned int data; 

   cout<<"请输入一个自然数:"; 

   cin>>data; 

   while(data!=1) 

   { 

        if((data%2==0)) 

              {

            cout<<data<<"/2=";

                     data/=2; 

                     cout<<data<<endl;

              }

        else 

        { 

            cout<<data<<"*3+1=";

                     data=data*3+1; 

            cout<<data<<endl; 

        } 

   } 

   return 0;

}

【例2】求平方根

      用迭代法求某个数的平方根。已知求平方根的迭代公式为:

      (1)编程思路

      用迭代法求某个数a的平方根的算法为:

      (1)先自定一个初值x0,作为a的平方根值,例如,取a/2作为x0的初值。利用迭代公式求出一个x1。此值与真正的a的平方根值相比,误差可能很大。

      (2)把新求得的x1代入x0中,准备用此新的x0再去求出一个新的x1。

      (3)利用迭代公式再求出一个新的x1的值,也就是用新的x0又求出一个新的平方根值x1,此值将更趋近于真正的平方根值。

      (4)比较前后两次求得的平方根值x0和x1,如果它们的差值小于指定的值(如0.000001),即达到要求的精度,则认为x1就是a的平方根值,执行步骤5;否则执行步骤2,即循环进行迭代。  

      (5)迭代结束,输出结果x1。

(2) 源程序

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

    double x0,x1,a ;

       cin>>a;

    x0 =a/2;          // 迭代初值

    x1 =0.5*(x0 + a/x0);

    do

       {

         x0 = x1;  // 为下一次迭代作准备

         x1 = 0.5*(x0 + a/x0);

    } while (fabs(x1-x0)>0.000001);

    cout<<x1<<endl;       // 输出结果

       return 0 ;

}

posted on 2019-06-14 17:37  aTeacher  阅读(8457)  评论(0编辑  收藏  举报