python演算法 遞迴演算法和初步了解棧的概念

2021-10-23 23:03:46 字數 1420 閱讀 3948

我們上次學到了選擇排序的演算法,通過學習我們對python中的演算法有了乙個初步的了解,我們再來學習一種我們在python中非常常用和重要的演算法----遞迴,之前我們也通過斐波那契數列來簡單的了解過遞迴

回顧遞迴函式之斐波那契數列

但是我們得明白,遞迴只是讓我們解決問題的方法更加的清晰,但是並沒有在效能上的優勢!

我們還是以案例來介紹:我們有一堆的盒子,開啟乙個盒子我們可能會找到我們需要的鑰匙,但是也可能盒子中是另乙個盒子,我們想要找到鑰匙,有幾種解決的辦法呢?

方法一:使用while迴圈

建立乙個盒子堆,從盒子堆中找到乙個盒子,如果盒子裡是盒子則將盒子加入到盒子堆中,若找到的是鑰匙,則輸出結束

方法二:使用遞迴的思路進行解決

建立乙個盒子堆,所有的盒子相當於第一部分的盒子,將所有的盒子開啟檢視,若找到鑰匙則輸出結束,若沒找到鑰匙開出的盒子相當於第二部分的盒子,返回第一步用同樣的方法和思路去檢視第二部分的盒子,依次類推,直到找到鑰匙輸出結束

這裡我麼還得了解乙個概念----基線條件和遞迴條件

在使用遞迴的時候,我們為了避免無限迴圈的情況,每個遞迴都是有兩個部分組成:基線條件(base case)和遞迴條件(recursive case),遞迴條件是函式呼叫自己,而基線條件是為了避免形成無限迴圈

這裡我寫了乙個簡單的數字倒數來進行理解:

def

num_daoshu

(num)

:# 這個引數是從幾開始倒數

print

(num)

# 輸出這個數字

if num <=0:

# 基線條件

return

else

:# 遞迴條件

return num_daoshu(num -1)

print

(num_daoshu(5)

)

棧是一種簡單的資料結構棧採用先進後出或者是後進先出的方式儲存資料,棧中資料的插入刪除操作都是在棧頂端進行在遞迴函式中呼叫棧:還是盒子堆中找鑰匙的例子,我們有a和b兩個盒子,我們開啟a發現了盒子c,開啟c,我們發現c是空的,因此我們去返回去開啟盒子b…知道找到鑰匙

遞迴呼叫棧就類似於這樣

使用棧雖然方便,但是在儲存相近的資訊可能占用大量的記憶體,每個函式呼叫都會占用一定的記憶體,因此我們的棧會累計的很高,計算機儲存了大量的函式呼叫的資訊,

這種情況我們有兩種解決辦法:

1.重新編碼,轉而使用迴圈

2.使用尾迴圈(這是乙個高階遞迴主題暫時忽略),並且不是每種語言都支援尾迴圈

python 演算法 遞迴演算法

在計算機中,程式呼叫自身的程式設計技巧我們稱之為遞迴演算法。那麼再通俗一點來講就是 在某個python檔案中,有乙個函式,這個函式可以在自己的函式體內根據條件,自己呼叫自己的函式,那麼這樣自身呼叫自身的過程或者說行為,我們稱之為遞迴。1 假設,有乙個直線型的迷宮 只有一條路,不能拐彎 迷宮中有乙份藏...

Python演算法 計數初步

1.sum求和 x 2 sum x y for y in range 1,101 10100 5050 2 10100 sum i for i in range 1,101 5050 sum 3 i for i in range 1,101 5350 sum 3 i for i in range 1...

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...