遞歸說白了就是程序調用自身。
與遞推思想相比,遞歸就是遞推的反向過程。
遞歸的分析思路可以總結爲4步:
1、尋找遞推關係
2、尋找臨界條件
3、總結遞歸表達式
4、改寫成遞歸函數
舉個最簡單的栗子:
求整數1到100的和。
分析:
1、關係:
很明顯,第n項是前1個數字加1,f(n)=f(n-1)+1、前n項和sum(n)=sum(n-1)+n;
2、臨界:
很明顯,當n等於1時,sum值爲1;
3、表達式:
4、函數:
// 求第n項
function fn(n){
if(n==1) return 1;
return fn(n-1)+1;
}
// 求前n項和
function sum(n){
if(n==1) return 1;
return sum(n-1)+n;
// return sum(n-1)+fn(n);// 也可以調用fn()
}
sum(100);
完事!
是不是很簡單!
再舉個栗子:
求一個數的階乘。
分析:
1、關係:
很明顯,n就是前1項的階乘*n,f(n)=f(n-1)*n;
2、臨界:
很明顯,當n等於1時,sum值爲1;
3、表達式:
4、函數:
var num=prompt("請輸入一個數,以計算其階乘")
console.log(fn(num));
function fn(n){
// 第一種寫法 常規寫法
if(n==1) return 1;
return fn(n-1)*n;
// 第二種寫法
if(n==1){}
else{n*=fn(--n)}
return n;
// 第三種寫法
if(n!=1){n*=fn(--n)}
return n;
}
是不是很簡單!
接下來做個有難度的經典題:
求斐波那契數列的第n項及前n項和。
首先斐波那契數列是1,1,2,3,5,8,13,21…
即第n項是前兩項的和。
什麼意思?f(n)=f(n-1)+f(n-2),就這麼個關係。
那極限臨界呢?
很明顯,斐波那契數列前2項必須是1和1。
什麼意思?f(1)=1;f(2)=1,就這麼個意思。
那表達式就出來了:
那前n項和呢?
和第一個栗子求和一樣的啊,調用fn()就行了。
接下來改寫成函數代碼:
// 計算第n個數
function fn(n){
if(n==1||n==2) return 1;
//if(n<=2) return 1; // 也可以寫成這樣
//if(n<=1) return n; // 還可以寫成這樣
return fn(n-1)+fn(n-2);
}
// 計算前n項的和
function sum(n){
if(n==1) return n;
return sum(n-1)+fn(n);
}
console.log(fn(2),sum(7)); // 1, 33
在下面這篇博客裏,
https://blog.csdn.net/PrisonersDilemma/article/details/89454382
我列出幾個經典題目,可以自己分析分析。
關係→臨界→表達式→函數