目的:ES6标准下的JS数据结构的一些实现代码。(作为记录和启发)

内容:递归。(递归会使得操作树和图数据结构变得更简单。所以要理解递归。)(未完成,待继续)

所有源码在我的Github上(如果觉得不错记得给星鼓励我哦):ES6的JavaScript数据结构实现之递归

一、递归基础应用

1、计算一个数的阶乘

1.1迭代阶乘(循环实现)
1
2
3
4
5
6
7
8
9
10
11
12
function factorialIterative(number) {
if (number < 0 ) {
return undefined;
}
let total = 1;
for (let n = number; n > 1; n--) {
total = total * n ;
}
return total;
}

console.log(factorialIterative(5)); //120
1.2递归阶乘(使用递归时,要找到原始问题和子问题是什么。例如factorial(5)=5*factorial(4))
1
2
3
4
5
6
7
8
9
function factorial(n) {

if (n === 1 || n === 0) {
return 1;
}
return n * factorial(n - 1);
}

console.log(factorial(5));//120

2、斐波那契数列。(斐波那契数列是另一个可以用递归解决的问题。)

2.1迭代求斐波那契数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function fibonacciIterative(n) {
let fibNMinus2 = 0;
let fibNMinus1 = 1;
let fibN = n;
for (let i = 2; i <= n; i++) {
fibN = fibNMinus1 + fibNMinus2;
fibNMinus2 = fibNMinus1;
fibNMinus1 = fibN;
}
return fibN;
}

console.log(fibonacciIterative(0));
console.log(fibonacciIterative(1));
console.log(fibonacciIterative(2));
console.log(fibonacciIterative(3));
console.log(fibonacciIterative(4));
2.2递归求斐波那契数
1
2
3
4
5
6
7
8
9
10
function fibonacci(n) {
if (n < 1) return 0;
if (n <= 2) return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacciIterative(0));
console.log(fibonacciIterative(1));
console.log(fibonacciIterative(2));
console.log(fibonacciIterative(3));
console.log(fibonacciIterative(4));

2.3记忆化斐波那契数

//注:记忆化是一种保存前一个结果的值的优化技术,类似于缓存。

1
2
3
4
5
6
7
8
9
10
11
function fibonacciMemoization(n) {
const memo = [0, 1];
const fibonacci = (n) => {
if (memo[n] != null) return memo[n];
return memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
};
return fibonacci(n);
}
console.log(fibonacciMemoization(2));
console.log(fibonacciMemoization(3));
console.log(fibonacciMemoization(4));