Python高階之路 7 5 遞迴

2021-09-24 04:06:04 字數 1505 閱讀 8099

遞迴對於初學者來說是乙個難點,初學者可能需要花一些精力在這上面。其實單從編寫遞迴的方式上來看並不難理解。所謂遞迴,就是在函式內部呼叫自身。在執行過程中,python解析器會利用棧(stack)處理遞迴函式返回的資料。所以遞迴函式的乙個必要條件是要有終止條件,否則棧就會溢位。在這裡並不討論遞迴的底層原理,只討論如何編寫遞迴函式。因為討論遞迴的底層原理,會讓初學者覺得更為複雜。所以在此不討論這些底層的原理,感興趣的可以去網上查一下資料。

通過遞迴可以實現很多經典的演算法,如階乘、斐波那契數列等。例7.7詳細描述了如何使用遞迴函式實現階乘和斐波那契數列。

[例 7.7] 本例將通過遞迴實現階乘和斐波那契數列。

假如計算階乘的函式是jc(n),其中n是整數型引數,該函式表示計算n的階乘。如果要計算n的階乘,從數學上描述有如下的公示。

n! = 1 x 2 x 3 x …xn

上面的公示也可以按如下形式描述。

n! = n x (n -1)!

如果用jc函式描述,會有如下的表示式。

jc(n) = n * jc(n -1)

其實這就是乙個典型的遞迴表示式。n!等於(n-1)!與n的乘積。而要計算(n-1)!,就需要計算(n-1)x(n-2)!。以此類推,計算1!,會有1!=1*(1-1)!=1*0!=1。由於0!等於1,所以0就是階乘的終止條件,當然有時也可以將0和1都作為階乘的終止條件。也就是說,在遞迴函式中,先要考慮終止條件,然後再進行遞迴呼叫。斐波那契數列與階乘的思路類似,也需要考慮終止條件。而斐波那契數列的終止條件是n等於1或2時,因為,斐波那契數列需要從第3個值開始,才可以用前兩個值的和作為當前值。而n等於1時,數列值是0,n等於2時,數列值是1。

# 計算階乘的遞迴函式

defjc

(n):

# 終止新增

if n ==

0or n ==1:

return

1else

:# 進行遞迴呼叫

return n * jc(n -1)

# 計算10的階乘,輸出結果:3628800

print

(jc(10)

)# 計算斐波那契數列的遞迴函式

deffibonacci

(n):

# 終止條件

if n ==1:

return

0# 終止條件

elif n ==2:

return

1else

:# 進行遞迴呼叫

return fibonacci(n -1)

+ fibonacci(n -2)

# 計算斐波那契數列的第10個值,輸出結果:34

print

(fibonacci(10)

)

輸出結果:

3628800

34

上面這些對於初學者來說,也許很難看得懂,不過沒關係。在這裡不需要你去看懂是什麼意思,只需要你去了解這個遞迴是什麼意思就可以了,在以後高階程式設計中會經常用到遞迴。

Scala高階之路 尾遞迴優化

scala高階之路 尾遞迴優化 遞迴呼叫有時候能被轉換成迴圈,這樣能節約棧空間。在函式式程式設計中,這是很重要的,我們通常會使用遞迴方法來遍歷集合。而不是所有的遞迴都能被優化。遞迴之所有能被優化是在指在函式的最後一行為遞迴呼叫 即尾遞迴 並且這個遞迴呼叫沒有其它元素參與。一.什麼情況能導致棧的溢位 ...

Python高階之路 一

一 python基礎語法知識 第一天 1 變數 定義 為了儲存 程式運算過程中的一些中間 結果,為了方便日後呼叫,資料修改 命名規則 1 由字母 數字 下劃線組成 2 不能以數字開頭,不能含有特殊的字元和空格 3 不能以保留字命名 4 不建議以中文命名 5 定義的變數名應該有意義 見名知意 6 駝峰...

python高階學習之路

正規表示式 正規表示式 match函式search函式 match物件 findal函式finditer函式 compile函式 sub函式split函式 正則標誌位和模式 beautifulsoup json模組及jsonpath lxml.etree模組 網路爬蟲 爬取頁面 urllib庫 ur...