目的:ES6標准下的JS數據結構的一些實現代碼。(作為記錄和啟發)
內容:遞歸。(遞歸會使得操作樹和圖數據結構變得更簡單。所以要理解遞歸。)(未完成,待繼續)
所有源碼在我的Github上(如果覺得不錯記得給星鼓勵我哦):ES6的JavaScript數據結構實現之遞歸
一、遞歸基礎應用
1、計算一個數的階乘
1.1迭代階乘(循環實現)
1 function factorialIterative(number) { 2 if (number < 0 ) { 3 return undefined; 4 } 5 let total = 1; 6 for (let n = number; n > 1; n--) { 7 total = total * n ; 8 } 9 return total; 10 } 11 12 console.log(factorialIterative(5)); //120
1.2遞歸階乘(使用遞歸時,要找到原始問題和子問題是什么。例如factorial(5)=5*factorial(4))
1 function factorial(n) { 2 3 if (n === 1 || n === 0) { 4 return 1; 5 } 6 return n * factorial(n - 1); 7 } 8 9 console.log(factorial(5));//120
2、斐波那契數列。(斐波那契數列是另一個可以用遞歸解決的問題。)
2.1迭代求斐波那契數
1 function fibonacciIterative(n) { 2 let fibNMinus2 = 0; 3 let fibNMinus1 = 1; 4 let fibN = n; 5 for (let i = 2; i <= n; i++) { 6 fibN = fibNMinus1 + fibNMinus2; 7 fibNMinus2 = fibNMinus1; 8 fibNMinus1 = fibN; 9 } 10 return fibN; 11 } 12 13 console.log(fibonacciIterative(0)); 14 console.log(fibonacciIterative(1)); 15 console.log(fibonacciIterative(2)); 16 console.log(fibonacciIterative(3)); 17 console.log(fibonacciIterative(4));
2.2遞歸求斐波那契數
1 function fibonacci(n) { 2 if (n < 1) return 0; 3 if (n <= 2) return 1; 4 return fibonacci(n - 1) + fibonacci(n - 2); 5 } 6 console.log(fibonacciIterative(0)); 7 console.log(fibonacciIterative(1)); 8 console.log(fibonacciIterative(2)); 9 console.log(fibonacciIterative(3)); 10 console.log(fibonacciIterative(4));
2.3記憶化斐波那契數
//注:記憶化是一種保存前一個結果的值的優化技術,類似於緩存。
1 function fibonacciMemoization(n) { 2 const memo = [0, 1]; 3 const fibonacci = (n) => { 4 if (memo[n] != null) return memo[n]; 5 return memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo); 6 }; 7 return fibonacci(n); 8 } 9 console.log(fibonacciMemoization(2)); 10 console.log(fibonacciMemoization(3)); 11 console.log(fibonacciMemoization(4));