1 斐波那契的 递归算法. (递归用的是 分治 的思想)
public static int Fib1(int n){
if (n == 1 || n == 2) {
return 1;
}
return Fib1(n-1)+Fib1(n-2);
}
斐波那契的 迭代(非递归)算法. (迭代用的是 动规 的思想)
public static int Fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
int last2 = 1; // 第i-2项
int last1 = 1; // 第i-1项
int cur = 0; // 当前项
while (n > 2) {
cur = last1 + last2; // 每次循环都要更新 前一项与前两项的值
last2 = last1;
last1 = cur;
n--;
}
return cur;
}
递归和迭代.
(1) 迭代: 利用变量的 原值 推算出变量的一个 新值.
如果 递归 是自己调用自己的话, 迭代 就是A不停的调用B.
(2) 递归 中一定有迭代, 但是 迭代 中不一定有递归, 大部分可以相互转换.
能用迭代的不用递归. 递归调用函数 浪费空间, 并且递归太深容易造成堆栈的 溢出.
2 阶乘的递归.
public static int Fac1(int num) {
if (num < = 2) {
return num;
}
return num * Fac1(num - 1);
}
阶乘的非递归.
public static int Fac(int num) {
int k = 1;
while (num > 0) {
k *= num;
num--;
}
return k;
}
3 错排算法. 错排问题: 有n个正整数1,2,3,…n, 将这n个正整数重新排列, 使其中的 每一个数都不在 原来的位置上.
public static float count(int n) {
if (n == 1) {
return 0;
} else if (n == 2) {
return 1;
} else {
return (n - 1) * (count(n - 1) + count(n - 2));
}
}