/* 递推算法: 通过已知条件,利用特定关系得到中间结论,然后得到最后结果。 1.顺推法: 从已知条件出发,逐步推导出要解决问题的方法。 例如斐波拉契数列。 2. 逆推法 根据结果推导出已知条件 */ // 斐波拉契数列的递推实现 # include <stdio.h> int main(void) { int Fn, f1, f2; // 初始值 f1 = 1; f2 = 1; int cnt; printf("请输入您想求解的数列元素位数:"); scanf("%d", &cnt); if (1 == cnt) Fn = f1; else if (2 == cnt) Fn = f2; else { int i; for (i = 3; i <= cnt; ++i) { Fn = f1 + f2; f1 = f2; f2 = Fn; } } printf("斐波拉契数列中第%d为%d! ", cnt, Fn); return 0; }
/* 迭代算法: 迭代算法又称为辗转法,是一种不断用旧的变量值递推得到 新的变量值的过程。 迭代法与递推法相同之处在于都是使用循环语句实现。不同之处 在于,迭代法使用的是 while 循环,而递推法使用的是 for 循 环。迭代法在迭代结束后得到一个解或一组解,递推法的循环控 制变量改变一次就得到一个解,循环结束得到一系列的解。迭代 法的迭代次数事前是未知的,而递推法的递推次数事前是已知的 迭代法分为精确迭代和未知迭代。 精确迭代: 通过迭代可以得到一个精确的解。例如:求最大公约数,进 制转换,质因数的分解 ,谷角猜想。 近似迭代: 通过迭代得到近似的解。例如:二分法,求定积分。 */ // 利用精确迭代法求最大公约数和最小公倍数 # include <stdio.h> int main(void) { int i, j; printf("请输入两个正整数:"); scanf("%d %d", &i, &j); int r; // 表示余数 int f1, f2; if (i < j) { f1 = j; f2 = i; } else { f1 = i; f2 = j; } while (0 != (f1 % f2)) { r = f1 % f2; f1 = f2; f2 = r; } printf("最大公约数为 %d 最小公倍数为 %d ", r, i*j/r); return 0; }