递归算法学习
核心:
所謂的遞歸函數就是在函數體內調用本函數。
注意問題:
使用遞歸函數一定要注意,處理不當就會進入死循環。遞歸函數只有在特定的情況下使用 ,比如階乘問題
//遞歸算法測試 10的階乘 function f(num){if(num<1){return 1;}else{return f(num-1)*num;} } console.log("10!的結果為:"+f(10));某大公司的面試題之一
//請實現一個fibonacci函數,要求其參數和返回值如下所示: /***@desc: fibonacci*@param: count {Number}*@return: result {Number} 第count個fibonacci值,計數從0開始fibonacci數列為:[1, 1, 2, 3, 5, 8, 13, 21, 34 …]則getNthFibonacci(0)返回值為1則getNthFibonacci(4)返回值為5*/ var getNthFibonacci = function (Num) {var count = parseInt(Num);if (isNaN(count) || count < 0)return 0;if (count <= 1)return 1;return getNthFibonacci(count-1) + getNthFibonacci(count-2); }; //獲取fibonacci數組的第 N 個值:索引從0開始 console.log(getNthFibonacci(4)); //從第一個開始打印fibonacci數列,長度是10 var arr = []; for (let i=0 ; i<10; i++ ){arr.push(getNthFibonacci(i)) } console.log("[ fibonacii length=10 ] = ",arr);?某大公司的面試題之二
//一共10級樓梯,每次可以走一步或兩步,求一共多少種走法。 //思路: // // 要想走到N(N=10)級,可以分為2種情況。 // // 從n-2級邁兩步 // 從n-1級邁一步 // // 那么對于n-2和n-1的情況也是各自分為兩種,以此類推。 // // 那么走法的和就是n-2的走法和n-1的走法之和。 // // 那么遞歸到最基本的(當前人在第0階臺階) // // 第0階臺階:0 // // 第1階臺階:1 // // 第2階臺階:2(1+1或者2) // // 得到公式,也就是斐波那契數列。 var fib = function (n){if(n == 1){return 1;}else if(n==2){return 2;}else if(n>2){return fib(n-1) + fib(n-2);} } console.log(fib(10));??某大公司的面試題之三
//1個細胞,一個小時分裂一次,生命周期是3小時,求n小時后容器內,有多少細胞。 // 思路: // // 細胞的生存周期是3個小時,那我們就可以把細胞在題目中狀態分為以下幾個狀態: // // a:剛分裂態——由前一小時的a,b,c分裂出 // b:分裂1小時態——由前一小時a長成 // c:分裂2小時態——由前一小時b長成 // d:分裂3小時態——死亡的細胞。由前一小時c長成,和之前的d一起組成。 // // 那么,我們就可以根據細胞狀態設定函數。分析每一個狀態的來源是哪里即可。 // // 容器中存活的細胞數目就是a、b、c三種狀態數量的總和。 var afib = function (n){if(n===0){return 1;} //初始的那個細胞return afib(n-1)+bfib(n-1)+cfib(n-1); } var bfib = function(n){if(n===0){return 0;} //一個小時之后才會生成return afib(n-1); } var cfib = function(n){if(n===0||n===1){return 0;} //前兩小時還沒生成return bfib(n-1); }var time = 3; console.log(afib(time)+bfib(time)+cfib(time));總結:
遞歸的兩個必要因素:
總結
- 上一篇: Python爬虫-爬取科比职业生涯高清图
- 下一篇: jQuery 之 niceScroll