棧
遞迴:自己呼叫自己下面我們通過實現從1加到100來理解遞迴。
從1加到100一般我們採用迴圈實現。
sum=0
for i in
range(1
,101):
sum+= i
print
(sum
)sum
=0
如果用遞迴實現
那麼就是
def
sum1
(max):
ifmax
<=
100and
max>=0:
#遞迴條件
return
max+ sum1(
max-1)
else
:return
0print
(sum1(
100)
)
將1加到100,是將問題拆分為,[1…99]+100,同時[1…99]可以拆分為[1…98]+99,這樣不斷地拆分下去,直到變為[1]+2,最後再將這些數加起來。遞迴是自己呼叫自己,當沒有結束條件時,便會無線呼叫自己,死迴圈。這裡同時涉及到遞迴地基線條件和遞迴條件。
如下面這個程式
def
countdown
(i):
print
(i) countdown(i-1)
countdown(
3)
本意是想要列印3到0停止,而因為沒有設定停止條件,導致無線迴圈,從而程式停止。
最終提示錯誤資訊
recursionerror: maximum recursion depth exceeded while calling a python object
故基線條件就是遞迴停止的條件。那麼,這裡我們需要到達0停止,則程式修改如下:
def
countdown
(i):
print
(i)if i <=1:
#基線條件
return
else
: countdown(i-1)
countdown(
3)
而遞迴條件便是,每次需要改變的最小值。如這裡將**改為
def
countdown
(i):
print
(i)if i <=1:
return
else
: countdown(i-2)
#遞迴條件為其值-2,不再是-1
countdown(
9)
棧就是乙個箱子,東西放進去以後,若要拿出最下面的東西,只有把上面的東西拿出來才能拿出最下面的東西。是乙個先進後出的結構
def
greet
(name)
:print
("hello,"
+ name +
"!")
greet2(name)
print
("getting ready to say bye ..."
) bye(
)def
greet2
(name)
:print
("how are you,"
+ name +
"?")
defbye()
:print
("ok,bye!"
)
greet(
"haobo"
)
最開始,棧為空,呼叫greet函式,那麼greet函式進棧。
開始執行,先print列印(在python中print也是乙個函式,這裡方便理解,省略其進棧過程。)
在greet執行過程中,呼叫了greet2函式,故greet2進棧。
執行greet2後,出棧,greet繼續執行,執行print後,再呼叫bey函式進棧執行。
最後執行完成後,棧為空。
執行結果如下:相信你能理解!
下面再用乙個遞迴求階乘的例子讓你更加能夠理解把。
def
fact
(x):
if x ==1:
return
1else
:return x * fact(x-1)
print
(fact(10)
)
將109…1>>10(9…1)>>10(9*(8*…1))最終變為10(9*(8*…*(1 )…)的樣子。
什麼是遞迴 先了解什麼是遞迴
一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山 還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那就稱為...
什麼是遞迴 先了解什麼是遞迴
原文 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那...
什麼是遞迴 先了解什麼是遞迴
歡迎閱讀我的個人部落格,有更好的排版和文章 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴...