js學習小記----遞歸

今天是2019年的最後一天,大家都去跨年了,自習室就寥寥幾個人,今天就把遞歸給記錄下來吧,等什麼時候想不起來了還能回頭來看看。
什麼是遞歸呢?這個名字起的很高大尚,剛一聽感覺好難的樣子,我剛開始學遞歸的時候差不多這個狀態,苦思冥想什麼是遞歸,還查了很多資料,但是當你搞明白了之後就會發現其實很簡單。
遞歸就是在一個函數體的內部調用這個函數,這就是遞歸。下面寫一個例子吧,就拿最經典的斐波那契數列:

function fbnq(count) {
				if(count == 0 || count == 1){
					return 1
				}
				else{
				//在這裏調用這個函數本身
					return fbnq(count - 1) + fbnq(count - 2);
				}
			}

斐波那契數列的原理就是:比如這是一個斐波那契數列:
1 1 2 3 5 8 13 21 34 怎麼求這個數列呢? 設第一個數爲 first,第二個數爲seconed,第三個數爲three,他的原理就是第三個數等於前兩個數的和,就拿這個數列來說,2 = 1+1, 3 = 2 + 1, 5 = 3 + 2, 8 = 5 + 3, 13 = 8 + 5,21 = 13 + 8 34 = 21 + 13這裏的每一個式子的結果相當於下一個式子的其中一個加數,對應上面的函數,count就相當於這個數列的總和(數列第一個數字索引值是0,最後一個是8,因此count = 8),執行這個函數的時候,return後面第一個函數的count就相當於是7,第二個函數就相當於6,依次類推,當找到出口之後就會在一遍一遍加回來,所以說他效率不高。如果對上面這段話不理解,請看下面的分析:

            1. fbnq(7) + fbnq(6)
			2. fbnq(6) + fbnq(5)    fbnq(5) + fbnq(4)
			3. fbnq(5) + fbnq(4)    fbnq(4) + fbnq(3)  fbnq(3) + fbnq(2)
			4. fbnq(4) + fbnq(3)    fbnq(3) + fbnq(2)  fbnq(3) + fbnq(2)  fbnq(2) + fbnq(1)  fbnq(2) + fbnq(1)  fbnq(1) + fbnq(0);
			fbnq(2) = 2
			fbnq(3) = 3
			fbnq(4) = 5
			fbnq(5) = 8
			fbnq(6) = 13
			fbnq(7) = 21
			fbnq(8) = 34

從上圖可以看出來,雖然視覺上看着很簡單,實際上內部要實現這樣複雜的操作。
使用遞歸很簡單就可以完成斐波那契數列的問題,在使用遞歸時一定要注意,因爲一個處理不當就會陷入死循環,所以使用遞歸最重要的是要找到那一個出口,在這個例子中return 1就是出口,如果沒有這一行代碼,就會陷入死循環。如果不用遞歸求斐波那契數列,而是使用for循環什麼的去求肯定比這個複雜。所以遞歸在很大程度上使函數更加的簡潔。
但是使用遞歸是好的嗎? 這是不一定的,雖然視覺上使用遞歸使函數變得簡單了,但是他非常損耗性能,效率很低。因爲他要一遍一遍的調用自身,直到找到那一個出口纔會結束。
平時可以儘量少用遞歸來實現一些功能。
如果對您有幫助,點個贊是對我最大的鼓勵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章