python 演算法 遞迴演算法

2021-10-09 04:06:05 字數 4372 閱讀 2869

​ 在計算機中,程式呼叫自身的程式設計技巧我們稱之為遞迴演算法。那麼再通俗一點來講就是:在某個python檔案中,有乙個函式,這個函式可以在自己的函式體內根據條件,自己呼叫自己的函式,那麼這樣自身呼叫自身的過程或者說行為,我們稱之為遞迴。

​ (1)假設,有乙個直線型的迷宮(只有一條路,不能拐彎),迷宮中有乙份藏寶圖。

​ (2)那麼,有一天我來到迷宮入口,那麼當我進入這個迷宮的大門的時候。我們就可以理解為:就是在程式中的某個地方呼叫了該函式。

​ (3)當你進入迷宮以後,驚奇的發現還要乙個門,那麼你就再開啟這個門進入。當你開啟這個門的時候,就可以理解為:在該函式體中,它自己開始呼叫自己

​ (4)當你進入這個門以後,你又發現裡邊還要乙個門,於是開啟門,這個時候又發現了乙個門,就這樣你迴圈往復,一直是乙個行為(開啟門然後進入)。這裡我們就可以理解為,在該函式體內,這個函式一直呼叫自己。

​ (5)這樣,經過了很久,你開啟了一道門,發現裡邊沒有其他的門了,並且只乙個盒子,那麼你開啟這個盒子,拿到了藏寶圖。這個時候就可以理解為遞迴到了出口的地方,或者說遞迴到了一定次數了。

​ (6)最後,你帶著這個藏寶圖要離開這個鬼地方,那麼你就要原路返回,因為這是乙個直線型的迷宮,沒有其他的路了,所以你帶著藏寶圖不斷的走出乙個個的門,最終從迷宮**來了。那麼,這個過程我們就可以理解為函式已經遞迴到了該函式的出口條件這裡,並且,要帶著出口條件中的值(次數)往回返,通過這個次數和在該函式體內部呼叫自己時設定的規律,找到其他的值,並且將這些值做一定的處理。

​ (1)如果不使用遞迴,而使用迴圈,那麼**量會比較多

​ (2)使用迴圈實現的那麼程式不容易理解,但是使用遞迴就會好理解很對

​ (3)如果使用迴圈,程式的效能可能更高,如果使用遞迴,程式更容易理解,所以如何選擇什麼對你來說更重要

​ (1)要實現遞迴必須有乙個函式

​ (1)並且在這個函式體內要自己呼叫自己

​ (3)遞迴必須要有乙個深度,也就是判斷條件,這個判斷條件是判斷次數或者說個數的

​ (7)到達一定的深度後必須返回乙個東西,哪怕是空的也可以,目的是結束遞迴

​ (8)未到達一定深度時,可以返回該函式,但同時也可以不返回,這個根據需求而定,但是必須不斷呼叫函式自身

需求:

​ 使用者輸入乙個數字,那麼就算該數字的階乘,並列印出來

分析:

​ (1)我們可以將使用者輸入的數字或者這個題看成是乙個列表,那麼該列表的長度就是 n

​ (2)此時我們知道了列表的第乙個元素為1,最後乙個元素為n,那麼要計算1-n之間的元素相乘

​ (3)那麼就必須 n-1,找到前邊的元素的值

​ (4)當 n == 1的時候,就到了該列表的第乙個位置了,所以就不能再往前了

​ (5)因為計算機不知大第乙個元素是啥,那麼我們就要返回乙個1,來告訴計算機

​ (6)最後計算機根據遞迴的出口值,以及函式遞迴的規律,進行計算

​ (7)最後返回你想要的結果

# 函式必須第乙個引數,這個引數的作用是你求取第幾個數字的階乘

deffunc

(n):

# 因為我們只知道任何數字的階乘最後都要 * 1,那麼這就是遞迴深度或者說次數

if n ==1:

# 那麼我們就返回 1,將1返回給呼叫它的人,就是下面的函式呼叫

return

1else

:# 因為n!= n * n-1 ...*1,那麼5!= 5*4!

return n * func(n-1)

if __name__ ==

'__main__'

:# 求5的階乘,傳入乙個遞迴次數5

result = func(5)

# 列印結果

print

(result)

需求:​ 有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第乙個人大兩歲。最後問第乙個人,他說是10歲。請問第五個人多大?

分析:

​ (1)因為是5個人,那麼我們就可以看作為長度為5的列表

​ (2)並且這個列表中儲存了1-5個人的年齡,第五個元素為10,而剩下人的年齡都是在它後邊的人的年齡上+2

​ (3)那麼我們可以將這個假設的列表反轉,將第五個人的年齡變為第乙個,也就是10在第乙個索引位置,而剩下人的年齡都變為它前邊人的年齡+2

​ (4)那麼我們可以將第乙個人和他的年齡作為遞迴的深度,和返回的值

​ (5)而剩下人都是 n-1,拿到前乙個元素的值,在基礎上+2

​ (6)最後返回的就是第五個人的年齡,反轉過來其實就是第乙個人的年齡

def

func

(n):

# 當遞迴到第乙個人的年齡時,說明到了指定深度

if n ==1:

# 返回第乙個人的年齡10

return

10else

:# 當沒有到達遞迴深度,就繼續拿到上乙個人的年齡,並在此基礎上+2,最後返回的就是第5個人的年齡,反轉過來就是第乙個人的年齡

return

2+ func(n-1)

if __name__ ==

'__main__'

:# 長度為5

age = func(5)

print

(age)

需求:​ 利用遞迴函式呼叫方式,將所輸入的5個字元,以相反順序列印出來

分析:

​ (1)首先是列印,那麼當沒有打到達遞迴深度時就不反悔值了,而是輸出,再呼叫函式自身

​ (2)並且這5個字元我們都知道了,所以到達遞迴深度後,什麼也不需要返回,直接 return 終止該函式就行

​ (3)那麼為了儲存這5個元素,要將其存入列表,通過列表去取值

def

func

(n):

# 當遞迴到索引為0的時候

if n ==0:

# 終止該函式

return

# 當沒有遞迴到指定深度時

else

:# 要輸出列表中的值,因為列表比長度少1,索引必須-1才能拿到對應的值,那麼輸出的時候的順序為從後往前

print

(mylist[n-1]

)# 遞迴次數

func(n-1)

if __name__ ==

'__main__'

:# 定義乙個空列表

mylist =

# 使用for迴圈來拿到5個字元,並將5個字元存入列表中

for i in

range(1

,6):

mystr =

input

(f"請輸入第個字元:"

)# 傳入列表的長度,因為列表的長度為5,那麼也就是5個字元

func(

len(mylist)

)

需求:​ 使用遞迴演算法,求指定位數的斐波那契數列

分析:

​ (1)斐波那契數列是典形的兔子數列,第一位和第二位為1,從第三位開始,前兩項的和等於第三項

​ (2)那麼我們可以將指定位數n看作為列表的長度,而列表的第一位和第二位為1,然後從第三位開始每乙個元素的值為前兩項元素的和

​ (3)那麼遞迴的出口就是1或者2,出口返回的值為1,然後遞迴呼叫函式的引數為 n-1 + n-2,也就是第三項的值,或者說我們求的指定位數的值。

def

func

(n):

if n ==

1or n ==2:

return

1else

:return func(n-1)

+ func(n-2)

if __name__ ==

'__main__'

: result = func(5)

print

(result)

def func(n):

if n == 1 or n == 2:

return 1

else:

return func(n-1) + func(n-2)

ifname== 『main』:

result = func(5)

print(result)

python 遞迴演算法

一 遞迴演算法三定律 二 通過求列表和分析遞迴演算法 如下 def list sum num list if len num list 0 return 0 elif len num list 1 return num list 0 else return num list 0 list sum n...

python演算法之遞迴演算法

coding utf 8 import numpy as np 遞迴演算法 i 0 def my recursion list,n global i try if list i n 基線條件 return i,i 1 else 遞迴條件 i 1 return my recursion list,n ...

python遞迴 演算法 遞迴(Python解釋)

通俗一點來說,遞迴就是一種在函式內呼叫自己的演算法。每一級呼叫都會有自己的引數。每一次呼叫都會有一次返回。可能是返回自己,繼續遞迴 也可能是返回特定值,結束遞迴。遞迴解釋 優點 直觀,實現簡單,可讀性好。缺點 會有重複的呼叫 優化裡會說明 占用空間大,遞迴太深,會造成棧溢位 呼叫太多,不給你呼叫了 ...