发布网友 发布时间:2022-04-23 01:16
共1个回答
热心网友 时间:2023-09-03 18:04
最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
定理:*(a,b) = *(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停止的步骤,这实际上是一个循环结构。其算法用C语言描述为: int Gcd_2(int a,int b)/*欧几里德算法求a,b的最大公约数*/{if (a<=0 || b<=0)/*预防错误*/return 0;int temp;while (b > 0)/*b总是表示较小的那个数,若不是则交换a,b的值*/{temp = a % b;/*迭代关系式*/a = b;b = temp;}return a;}从上面的程序我们可以看到a,b是迭代变量,迭代关系是temp = a % b;根据迭代关系我们可以由旧值推出新值,然后循环执a = b; b = temp;直到迭代过程结束(余数为0)。在这里a好比那个胆小鬼,总是从b手中接过位置,而b则是那个努力向前冲的先锋。 还有一个很典型的例子是斐波那契(Fibonacci)数列。斐波那契数列为: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)得到,由旧值递推出新值,这是一个典型的迭代关系,所以我们可以考虑迭代算法。 int Fib(int n) //斐波那契(Fibonacci)数列{if (n < 1)/*预防错误*/return 0;if (n == 1 || n == 2)/*特殊值,无需迭代*/return 1;int f1 = 1,f2 = 1,fn;/*迭代变量*/int i;for(i=3; i<=n; ++i)/*用i的值来*迭代的次数*/{fn = f1 + f2; /*迭代关系式*/f1 = f2;//f1和f2迭代前进,其中f2在f1的前面f2 = fn;}return fn;}