zoukankan      html  css  js  c++  java
  • 迭代(一):迭代算法的基本思想

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

          迭代算法的基本思想是:为求一个问题的解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 ;

    }

  • 相关阅读:
    功能类控件
    关系类控件-明细表
    WPF MenuItem 四种角色分析
    自定义的 ListBoxItem 自适应ListBox的宽度
    由DataGridTextColumn不能获取到父级DataContext引发的思考
    GDI+中发生一般性错误的解决办法(转帖)
    WPF中RadioButton绑定数据的正确方法
    C# 使用XML序列化对象(二)
    C# 使用XML序列化对象(一)
    WPF中RadioButton的分组
  • 原文地址:https://www.cnblogs.com/cs-whut/p/11024564.html
Copyright © 2011-2022 走看看