歡迎閱讀我的個人部落格,有更好的排版和文章:一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子:從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山...
還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那就稱為死迴圈了。有關遞迴和死迴圈的異同我們之後會說到,那麼現在先來了解一下什麼是遞迴?
那麼什麼是遞迴呢?要理解遞迴,就得先了解什麼是遞迴,實際上這句話就是乙個遞迴。這麼說可能不好理解,接下來我舉個簡單的例子來解釋這段話的意義。
這下應該有點明白了吧,這個過程其實就是遞迴的過程,如果不了解遞迴,那就先了解什麼是遞迴,可能你會說這是個迴圈並不是遞迴,我們前面說到,遞迴是需要終止條件的,那麼你明白遞迴是什麼其實就是終止條件。整個過程,搜尋引擎充當遞迴函式(只是形象的假設)。在你去依次查詢遞迴/棧/記憶體/作業系統的過程為前行階段,在你都了解完之後,反回去了解含義的過程為退回階段。如果還是不太清楚,可以接著看下面的例子。
也許之前你在網路上看到過這張:
實際上這張圖就很形象地表達出了遞迴,這句嚇得我抱起了抱著抱著抱著我的小鯉魚的我的我的我如果從字面意義上看可能看不出是什麼意思,那麼我們可以通過**來實現同樣的效果:
function recursion(depth) else
console.log('的我');
}console.log('嚇得我抱起了');
recursion(2)
在終端的列印結果為如下,可以看到和上面的那段話是一樣的:
**其實十分簡單,但是需要理解的是:if
**塊的條件(!depth
)為遞迴呼叫的終止條件,在else
**塊內遞迴呼叫函式.我們前面有說到遞迴的過程是存在前行和退回階段的,那麼在前行階段我們在每次呼叫函式後,列印出了"抱著",並且當depth≠0
時重新呼叫該函式;在退回階段,將會去執行**console.log('的我');
再列印出"的我".
褚躍躍的圖也能比較清楚地反映出這個過程:
好了!這下你應該明白什麼是遞迴了吧?如果你還沒有明白什麼是遞迴的話,你可以看什麼是遞迴?
有關遞迴應用的應用有很多,例如註明的斐波拉契數列就可以通過遞迴來實現:
def fib(x):
if x < 2:
return 0 if x == 0 else 1
# 當x > 2時,開始遞迴呼叫fib()函式:
return fib(x - 1) + fib(x - 2)
print(fib(6)) # 列印結果為:8
這裡需要對i<2
時的特殊情況做出判斷,當x==0
時,直接返回0
,當x==1
時,直接返回1
首先我們需要了解遍歷的演算法:定義的file_display
函式以某個目錄(/home/pushy
)作為遍歷的起點.遇到乙個子目錄時,就先接著遍歷子目錄(遞迴呼叫函式)。遇到乙個檔案時,就直接對改檔案進行操作(這裡只列印出檔案的檔名):
import os
def file_display(filepath):
for each in os.listdir(filepath):
# 得到檔案的絕對路徑:
absolute_path = os.path.join(filepath, each)
# 得到是否為檔案還是目錄的布林值:
is_file = os.path.isfile(absolute_path)
if is_file:
# 當前的絕對路徑為檔案:
print(each)
else:
# 當前的絕對路徑為目錄:
file_display(absolute_path)
file_display('/home/pushy')
這樣我們就可以遍歷到/home/pushy
路徑下的所有檔案:
另外我們還可以使用遞迴來建立目錄:
import os
def createfile(dirname):
exits = os.path.exists(dirname)
if exits:
return true
else:
# 開始遞迴呼叫函式,並接受其返回值:
rec_result = createfile(os.path.dirname(dirname))
if rec_result:
# 如果不存在該目錄,則建立dirname的目錄,並返回已經建立(存在)的值true:
os.mkdir(dirname)
return true
createfile('./aa/bb/cc')
好了,遞迴的知識差不多介紹完了。如果看完上邊大概已經了解了迴圈和遞迴的區別了。對了!簡單來說,迴圈是有去無回,而遞迴則是有去有回(因為存在終止條件)。
舉個栗子,你用你手中的鑰匙開啟一扇門,結果去發現前方還有一扇門,緊接著你又用鑰匙開啟了這扇門,然後你又看到一扇們...但是當你開到某扇門時,發現前方是一堵牆無路可走了,你選擇原路返回——這就是遞迴
但是如果你開啟一扇門後,同樣發現前方也有一扇們,緊接著你又開啟下一扇門...直到開啟最後一扇門出去,或者一直沒有碰到盡頭 (死迴圈)——這就是迴圈。
什麼是遞迴 先了解什麼是遞迴
一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山 還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那就稱為...
什麼是遞迴 先了解什麼是遞迴
原文 一說起遞迴,我想每個人都不陌生。舉個從小就聽過的例子 從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山,山里有座廟,廟裡有個和尚,和尚在講故事,從前有座山.還有你從兩面相對的鏡子中看到的畫面,其實都是抽象出來的遞迴現象,但是嚴格來說並不是遞迴,因為會一直重複下去,沒有終止條件,那...
什麼是遞迴
迴圈 for 起始條件 迴圈終止條件 迴圈條件變化 遞迴 遞迴起始條件 func recursive n 有使遞迴趨於結束的語句 func recursive n 遞迴終止條件 n 9 include include include 直接或是或是間接呼叫自己的情形,就遞迴呼叫。recursive 遞...