迭代算法的定义:
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的的直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代法解决问题的步骤如下:
一、确定迭代变量。在可以利用迭代法解决问题时,至少存在一个直接或间接的不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。所谓迭代关系式,指如何从变量的上一个值推出下一个值的公式(或公式)。这个关系式是解决问题的关键,通常可以通过递推或者倒推的方法来完成。
三、对迭代过程进行控制。即必须考虑什么时候结束迭代过程。迭代过程的控制通常可分为迭代次数确定和不确定两种情况。对于次数确定可以用一个循环来实现迭代过程的控制;对于迭代次数不确定的需要分析出用来结束迭代的条件。
举例说明如下:
例一:用来计算两个正整数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 秒)