python基礎 函式遞迴

2022-07-10 19:30:15 字數 2884 閱讀 6641

函式不僅可以巢狀定義,還可以巢狀呼叫,即在呼叫乙個函式的過程中,函式內部又呼叫另乙個函式,而函式的遞迴呼叫指的是在呼叫乙個函式的過程中又直接或間接地呼叫該函式本身

例如在呼叫f1的過程中,又呼叫f1,這就是直接呼叫函式f1本身

在呼叫f1的過程中,又呼叫f2,而在呼叫f2的過程中又呼叫f1,這就是間接呼叫函式f1本身

從上圖可以看出,兩種情況下的遞迴呼叫都是乙個無限迴圈的過程,但在python對函式的遞迴呼叫的深度做了限制,因而並不會像大家所想的那樣進入無限迴圈,會丟擲異常,要避免出現這種情況,就必須讓遞迴呼叫在滿足某個特定條件下終止。

#1. 可以使用sys.getrecursionlimit()去檢視遞迴深度,預設值為1000,雖然可以使用

sys.setrecursionlimit()去設定該值,但仍受限於主機作業系統棧大小的限制

#2. python不是一門函式式程式語言,無法對遞迴進行尾遞迴優化。

#

一段**的迴圈執行的方案有兩種

#方式一:while、for迴圈

#while true:

#print(1111)

#print(2222)

#print(3333)

#方式二:遞迴的本質就是迴圈:

#def f1():

#print(1111)

#print(2222)

#print(3333)

#f1()

#f1()

#二:需要強調的的一點是:

#遞迴呼叫不應該無限地呼叫下去,必須在滿足某種條件下結束遞迴呼叫

#n=0

#while n < 10:

#print(n)

#n+=1

#def f1(n):

#if n == 10:

#return

#print(n)

#n+=1

#f1(n)##

f1(0)

下面我們用乙個淺顯的例子,為了讓讀者闡釋遞迴的原理和使用:

例4.5

某公司四個員工坐在一起,問第四個人薪水,他說比第三個人多1000,問第三個人薪水,第他說比第二個人多1000,問第二個人薪水,他說比第乙個人多1000,最後第一人說自己每月5000,請問第四個人的薪水是多少?

思路解析:

要知道第四個人的月薪,就必須知道第三個人的,第三個人的又取決於第二個人的,第二個人的又取決於第乙個人的,而且每乙個員工都比前乙個多一千,數學表示式即:

salary(4)=salary(3)+1000salary(3)=salary(2)+1000salary(2)=salary(1)+1000salary(1)=5000總結為: 

salary(n)=salary(n-1)+1000 (n>1)

salary(1)=5000 (n=1)

很明顯這是乙個遞迴的過程,可以將該過程分為兩個階段:回溯和遞推。

​ 在回溯階段,要求第n個員工的薪水,需要回溯得到(n-1)個員工的薪水,以此類推,直到得到第乙個員工的薪水,此時,salary(1)已知,因而不必再向前回溯了。然後進入遞推階段:從第乙個員工的薪水可以推算出第二個員工的薪水(6000),從第二個員工的薪水可以推算出第三個員工的薪水(7000),以此類推,一直推算出第第四個員工的薪水(8000)為止,遞迴結束。需要注意的一點是,遞迴一定要有乙個結束條件,這裡n=1就是結束條件。

**實現:

def

salary(n):

if n==1:

return 5000

return salary(n-1)+1000s=salary(4)

print

(s)執行結果:

8000

程式分析:

在未滿足n=1的條件時,一直進行遞迴呼叫,即一直回溯,見圖4.3的左半部分。而在滿足n=1的條件時,終止遞迴呼叫,即結束回溯,從而進入遞推階段,依次推導直到得到最終的結果。

遞迴本質就是在做重複的事情,所以理論上遞迴可以解決的問題迴圈也都可以解決,只不過在某些情況下,使用遞迴會更容易實現,比如有乙個巢狀多層的列表,要求列印出所有的元素,**實現如下

items=[[1,2],3,[4,[5,[6,7]]]]

deffoo(items):

for i in

items:

if isinstance(i,list): #

滿足未遍歷完items以及if判斷成立的條件時,一直進行遞迴呼叫

foo(i)

else

:

print(i,end='')

foo(items)

#列印結果1 2 3 4 5 6 7

使用遞迴,我們只需要分析出要重複執行的**邏輯,然後提取進入下一次遞迴呼叫的條件或者說遞迴結束的條件即可,**實現起來簡潔清晰

Python基礎 遞迴函式

通俗一點來說在函式的內部,直接去呼叫其他函式的方式叫做函式的巢狀.但是,如果這個函式呼叫的是自身呢?這個樣子的函式自身就屬於遞迴函式 經典例項 階乘自身就能用遞迴函式來表達出來 1 1 2 2 1 3 3 2 1 n n n 1 2 1以上是簡單直接說明了階乘的表達,接下來至二級用函式來進行直接表達...

python基礎 遞迴函式

遞迴函式 能自己呼叫自己的函式。特點 1必須有乙個明確的結束條件。否則會成死迴圈 2每次進入更深一層遞迴時,問題規模比上一層要減少。否則記憶體會撐爆 3遞迴效率不高,容易導致棧溢位。引入遞迴函式,先看乙個函式呼叫的執行順序。執行順序 如下圖。執行 過程中遇到函式,會在記憶體中載入函式,但不會執行,呼...

python基礎 函式遞迴

遞迴是一種程式設計思想,應用場景 在我們日常開發中,如果要遍歷乙個資料夾下面所有的檔案,通常會使用遞迴來實現 在後續的演算法課程中,很多演算法都離不開遞迴,例如 快速排序。3 2 1 def sum numbers num 1.如果是1,直接返回1 出口 if num 1 return 1 2.如果...