经典迭代的算法总结——斐波那契数和辗转相除法

1关于迭代法的理解:

迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量
在可以用迭代算法解决的问题中,至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析得出可用来结束迭代过程的条件。

2辗转相除法

辗转相除法又称为欧几里德算法,是一种经典的迭代算法。用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

定理:gcd(a,b) = gcd(b,a mod b)
证明:a可以表示成a = kb + r,则r = a mod b。假设d是a,b的一个公约数,则有 a%d==0,b%d==0,而r = a - kb,因此r%d==0 ,因此d是(b,a mod b)的公约数
同理,假设d 是(b,a mod b)的公约数,则 b%d==0,r%d==0 ,但是a = kb +r ,因此d也是(a,b)的公约数。
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。欧几里德算法就是根据这个原理来做的。它是一个反复迭代执行,直到余数等于0停止的步骤,这实际上是一个循环结构。代码表述:
/* 辗转相除法 */
	public static int gcd_2(int a, int b) {
		if (a < 0 || b < 0)/* 预防错误 */
			return 0;
		int temp;
		/* b总是表示较小的那个数,若不是则交换a,b的值 */
		while (b > 0) {
			temp = a % b;
			a = b;
			b = temp;
		}
		return a;
	}

从上面的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b; b = temp;直到迭代过程结束(余数为0)。b是向前不断的取值。

3斐波那契数列

斐波那契数列为:0、1、1、2、3、5、8、13、21、…,即 fib⑴=0; fib⑵=1;fib(n)=fib(n-1)+fib(n-2) (当n>2时)。
在n>2时,fib(n)总可以由fib(n-1)和fib(n-2)得到,由旧值递推出新值,这是一个典型的迭代关系,所以我们可以考虑迭代算法。

/* fibonacci数列 */
	public static int fibonacci(int n) {
		if (n < 1)
			return 0;
		if (n == 1 || n == 2)/* 特殊值无需迭代 */
			return 1;
		int f1 = 1, f2 = 1, fn = 0;/* 迭代变量 */
		int i;
		for (i = 3; i <= n; i++) {/* 用i的值来限制迭代的次数 */
			fn = f1 + f2;
			f1 = f2;// f1和f2迭代前进,其中f2在f1的前面
			f2 = fn;
		}
		return fn;
	}


你可能感兴趣的:(Algorithm)