# 算法模式
# 斐波那契数列
- 1 和 2 的斐波那契数是 1
- n(n>=2)的斐波那契数是 (n-1) 的斐波那契数加上 (n-2) 的斐波那契数
# 通过递归方式实现
function fibonacci (num) {
if (n < 1) return 0;
if (n <= 2) return 1;
return fibonacci(num - 1) + fibonacci(num - 2)
}
1
2
3
4
5
2
3
4
5
# 非递归方式
// 输出第 n 个 斐波那契数 的值
// 动态规划 滚动数组思想
function fibonacciIterative(n) {
// 要求 n >= 2
let fibNMinus2 = 0; // 起点 0
let fibNMinus1 = 1; // 起点 1
let fibN;
for (let i = 2; i <= n; i++) { // n >= 2 所以 fibNMinus2 从 0 开始
fibN = fibNMinus1 + fibNMinus2; // f(n-1) + f(n-2)
fibNMinus2 = fibNMinus1;
fibNMinus1 = fibN;
}
return fibN;
}
// 尾递归
function fib(n){
function fib_(n, a, b){
if(n === 0) return a
else return fib_(n-1, b, a + b)
}
return fib_(n, 0, 1)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 输出斐波那契数列
function fibonacciList (n) {
f = [1, 1]
for (let i = 2; i < n; i++) {
f = f.concat([f[i-1] + f[i - 2]])
}
return f
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 记忆型斐波那契数列
// 求和
function fibonacciMemoization(n) {
const memo = [0, 1];
const fibonacci = (n) => {
if (memo[n] != null) return memo[n];
return memo[n] = fibonacci(n - 1) + fibonacci(n - 2); // 注意这里反回的是等号右边的值
};
return fibonacci(n);
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 阶乘
function factorialIterative(number) {
if (number < 0) {
return undefined;
}
let total = 1;
for (let n = number; n > 1; n--) {
total = total * n;
}
return total;
}
function factorial(n) {
// console.trace();
if (n === 1 || n === 0) {
return 1;
}
return n * factorial(n - 1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18