这几个词汇都与重复有关。
- 循环:最基础的概念,指所有重复的行为
- 递归:在函数内调用自身,将复杂情况逐步转化为基本情况
- 迭代:在多次循环中逐步接近结果,每一次迭代的结果会作为下一次迭代的初始值
- 遍历:按规则访问非线性结构中的每一项
1. 迭代与递归
先举例:计算 n!
使用递归:
public int factorial(int n) {
if (n == 1) {
return 1;
}
return n * factorial(n - 1);
}
使用迭代:
public int factorial(int n) {
int product = 1;
for (int i = 2; i < n; i++) {
product *= i;
}
return product;
}
递归和迭代理论上可以相互转换。但实际从算法结构来说,递归声明的结构并不总能转换为迭代结构(有些结构在设计初期用迭代很难实现,如图、网格等)
原理上讲:所有递归都是可消除的,比如自己维护栈的形式。
举例:
求解斐波那契数列:
F(n) = F(n−1) + F(n−2)
递归法:
public int fabonacci(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fabonacci(n - 1) + fabonacci(n - 2);
}
递归转迭代:
public int fabonacci(int n) {
if (n == 1 || n == 2) {
return 1;
}
int fx = 1;
int fy = 1;
int fz = 0;
for (int i = 2; i <= n; i++) {
fz = fx + fy;
fx = fy;
fy = fz;
}
return fz;
}
使用栈消除递归:
自己模拟栈