所謂的遞迴函式就是在函式體內呼叫本函式。
使用遞迴函式一定要注意,處理不當就會進入死迴圈。遞迴函式只有在特定的情況下使用 ,比如階乘問題
//遞迴演算法測試 10的階乘
function f(num)else
}console.log("10!的結果為:"+f(10));
//請實現乙個fibonacci函式,要求其引數和返回值如下所示:
/** *@desc: fibonacci
*@param: count
*@return: result 第count個fibonacci值,計數從0開始
fibonacci數列為:[1, 1, 2, 3, 5, 8, 13, 21, 34 …]
則getnthfibonacci(0)返回值為1
則getnthfibonacci(4)返回值為5
*/var getnthfibonacci = function (num) ;
//獲取fibonacci陣列的第 n 個值:索引從0開始
console.log(getnthfibonacci(4));
//從第乙個開始列印fibonacci數列,長度是10
var arr = ;
for (let i=0 ; i<10; 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)else if(n==2)else if(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) //初始的那個細胞
return afib(n-1)+bfib(n-1)+cfib(n-1);
}var bfib = function(n) //乙個小時之後才會生成
return afib(n-1);
}var cfib = function(n) //前兩小時還沒生成
return bfib(n-1);
}var time = 3;
console.log(afib(time)+bfib(time)+cfib(time));
遞迴的兩個必要因素:
遞迴方程,即由需求抽象出來的乙個,類似數學上的通用公式如fn(n) = fn(n-1) + fn(n-2)。
遞迴結束條件,即阻止遞迴方程無限的迴圈下去。
遞迴 演算法學習
遞迴按照遞迴方式可以分為直接遞迴和間接遞迴 1.直接遞迴 遞迴過程p直接呼叫自己 2.間接遞迴 p包含另乙個過程d,而d又呼叫p 遞迴例項 1.漢諾塔問題 include include void hanoi int n,char a,char b,char c int main void 2.八皇...
演算法學習筆記 遞迴
漢諾塔問題 有種說法我覺得很好,所謂遞迴,就是利用大道至簡的思想,把乙個大的複雜的問題層層轉換為乙個小的和原問題相似的問題來求解的這樣一種策略。優點缺點 遞迴給人的感覺是驚豔,它往往能給我們帶來非常簡潔非常直觀的 形勢,從而使我們的編碼大大簡化。效率往往很低,費時和費記憶體空間。在遞迴呼叫的過程當中...
演算法學習1 遞迴
遞迴 乙個函式呼叫其自身。不同名字空間上的迴圈。注意 使用遞迴策略時,必須有乙個明確的遞迴結束條件,否則遞迴將會無限進行下去。參考 中國大學mooc 演算法基礎 話歪之地的部落格 int factorial int n else 執行f 3 2 f 3 5 f 2 2 f 2 5 f 1 2 f 1...