對JS中遞歸的粗淺理解

遞歸說白了就是程序調用自身。
與遞推思想相比,遞歸就是遞推的反向過程。

遞歸的分析思路可以總結爲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、表達式:
sum(n)={1,n=1sum(n1)+n,n>1sum(n)= \left \{\begin{array}{cc} 1, & n=1\\ sum(n-1)+n, & n>1 \end{array}\right.
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、表達式:
fn(n)={1,n=1fn(n1)n,n>1fn(n)= \left \{\begin{array}{cc} 1, & n=1\\ fn(n-1)*n, & n>1 \end{array}\right.
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,就這麼個意思。

那表達式就出來了:
fn(n)={1,n<=2fn(n1)n,n>2fn(n)= \left \{\begin{array}{cc} 1, & n<=2\\ fn(n-1)*n, & n>2 \end{array}\right.

那前n項和呢?
和第一個栗子求和一樣的啊,調用fn()就行了。
sum(n)={1,n=1sum(n1)+f(n),n>1sum(n)= \left \{\begin{array}{cc} 1, & n=1\\ sum(n-1)+f(n), & n>1 \end{array}\right.

接下來改寫成函數代碼:

	// 計算第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
我列出幾個經典題目,可以自己分析分析。
關係→臨界→表達式→函數

發佈了51 篇原創文章 · 獲贊 69 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章