什麼是遞歸
在函數內部,是可以調用其他函數的。如果一個函數在內部調用自身,就稱這個函數就是遞歸函數。
舉個例子:
實現一個可以自定義重複列印你好的函數。
要實現重複列印,可能我們立馬就會想到使用循環。
如果要求不能使用循環呢,那我們就可以通過下面的方法來實現。
原理很好理解,就是不斷的調用自身,如果前面不加上if條件判斷,理論上是會陷入死循環的,但是實際上遞歸到一定次數(最大遞歸次數)就會報錯停止。
遞歸有什麼用
知道遞歸是怎麼回事,那麼遞歸有什麼實際用處嘛,或者說有什麼獨特之處。比如上面的例子用循環就很方便,我為什麼還要學習遞歸這種方法呢?
遞歸實際上是一種解決問題的方法,將問題分解為更小的子問題,直到得到一個足夠小的問題可以被很簡單的解決。對於非常簡單的問題,可能我們使用循環就非常方便,比如前面的那個案例,但是有些問題如果使用循環,可能就會非常麻煩,或者解決方案很難讓人理解清楚裡面的邏輯。
因為遞歸函數是找到最小問題的解決方法,然後只要不斷使用這個方法就可以解決了,所以遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
下面就通過一些案例來實際感受一下。
遞歸的應用
1.計算階乘n! = 1 x 2 x 3 x ... x n
本案例來源於廖雪峰的網站
factorial(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = factorial(n-1) x n
所以,factorial(n)可以表示為n x factorial(n-1),只有n=1時需要特殊處理。
於是,factorial(n)用遞歸的方式寫出來就是:
在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。
===> factorial(5)
===> 5 * factorial(4)
===> 5 * (4 * factorial(3))
===> 5 * (4 * (3 * factorial(2)))
===> 5 * (4 * (3 * (2 * factorial(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
2.斐波那契數列
列舉可以得出0,1,1,2,3,5,Fib(n-2),Fib(n-1),Fib(n);除了第一項和第二項都為1外(0忽略),需要單獨拿出來,其它項都滿足Fib(n)=Fib(n-2)+Fib(n-1)
模仿Fib函數當i = 5的執行過程。
函數如果調用自己比較難理解,可以看作調用其它函數,只不過和自己長的相同而已相同而已。
3.螺旋線
每一次都是前進length長度,然後右轉,長度需要不斷的減小,直到小於5停止。
(全文完)
教你實現一個gif處理軟體(下)
如何理解python一行代碼實現一個愛心字符畫?
顯示進度下載圖片
如何使用python實現文本進度條?