举例说明迭代算法

来源:互联网 发布:网易163imap设置端口 编辑:程序博客网 时间:2024/05/17 05:12

 迭代算法的定义:  

    

       迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的的直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

 

 

利用迭代法解决问题的步骤如下:

 

一、确定迭代变量。在可以利用迭代法解决问题时,至少存在一个直接或间接的不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。所谓迭代关系式,指如何从变量的上一个值推出下一个值的公式(或公式)。这个关系式是解决问题的关键,通常可以通过递推或者倒推的方法来完成。

三、对迭代过程进行控制。即必须考虑什么时候结束迭代过程。迭代过程的控制通常可分为迭代次数确定和不确定两种情况。对于次数确定可以用一个循环来实现迭代过程的控制;对于迭代次数不确定的需要分析出用来结束迭代的条件。

 

 

举例说明如下:

 

例一:用来计算两个正整数a,b最大公约数欧几里德算法(也称辗转相除法);

定理:若c是a和b的公约数,那么c也是b和(a mod b)的公约数(其中a>b,并且a mod b不为0)。(这个定理在此就不证明了)。

例子:求30和12的最大公约数,并输出这些公约数。

程序如下所示:

/**
 * greatest common divisor最大
 * 公约数简写为GCD
 *
 * @author Administrator
 */
public class GCD {
    public static void main(String args[]){
        GCD gcd=new GCD();
        System.out.println(gcd.gcd(12,30));
    }
   
    public int gcd(int a,int b){
        if(b==0){
            return a;
        }
        else{
            while(b!=0){
                int r=a%b;
                a=b;
                b=r;      
            }
            return gcd(a,b);
        }
    }
   
}

运行结果如下:

run:
6
成功生成(总时间:0 秒)

 

 

例二:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

 

解析:每个月兔子的对数变化为:1、1、2、3、5、8、13、21···

这是一个斐波那契(Fibonacci)数列,它的规律是后一个值是前两个值的和。

 

程序如下所示:

public class Rabbit {
    public static void main(String args[]){
        Rabbit r=new Rabbit();       
        System.out.println(r.total(10)*2);
    }
   
    public int total(int i){
        if(i==1||i==2){
            return 1;
        }
        else{
            return total(i-1)+total(i-2);
        }
    }  
}

运行结果如下:

run:
110
成功生成(总时间:0 秒)