经典迭代的算法总结——斐波那契数和辗转相除法
来源:互联网 发布:应收账款软件标志 编辑:程序博客网 时间:2024/06/07 17:17
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停止的步骤,这实际上是一个循环结构。代码表述:
证明: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;}
0 0
- 经典迭代的算法总结——斐波那契数和辗转相除法
- c语言经典题算法1--用辗转相除法求两个数的最大公约数
- 用栈和迭代求解斐波那契数的非递归算法
- 求两个数的最大公约数——辗转相除法
- 关于求最大公约数经典算法---辗转相除法的思考
- 求最大公因数的经典算法:Euclid辗转相除法
- 两个数的最大公约数------欧几里德算法(辗转相除法)
- 递推、递归与迭代的本质,以及,辗转相除与斐波那契的惊人相似性
- 辗转相除法 求 两个数的 最大公约数 和 最小公倍数
- C语言 求两个数的最大公约数 (算法)--辗转相减法、辗转相除法
- 最小公倍数、最大公约数的算法和辗转相除法
- 辗转相除法和扩展欧几里得算法
- 用辗转相除法求两个数的最大公约数和最小公倍数(什么是辗转相除法,讲解)(C++语言)
- 斐波那契数的迭代实现和递归实现
- 求公约—辗转相除法—欧几里得算法
- 斐波那契数列的递归算法和迭代算法
- 再谈分数求和:求最大公约数——老吴憨算法和辗转相除法
- 每天一道算法--经典兔子繁殖迭代问题(斐波那契数列)
- 从This Handler class should be static or leaks might occur!警告说起
- awk的FS
- AES 加密算法
- 为什么计算机类期刊的影响因子这么低?
- JAVA 非阻塞IO原理
- 经典迭代的算法总结——斐波那契数和辗转相除法
- android开发之Notification_通知栏消息
- 算法导论系列文章之同时查找最大值和最小值
- 忆2013,致2014 -- 一个程序员老总的年终总结之(五)
- jquery ui 简单的 table
- 位域及其内存对齐
- 【九度】题目1000:计算a+b
- ubuntu 命令
- codeforces日记371d