一、遞歸
遞歸調用:一個函數,調用的自身,稱為遞歸調用
遞歸函數:一個可以調用自身的函數稱為遞歸函數
凡是循環能干的事,遞歸都能干
方法:
1、寫出臨界條件
2、找這一次和上一次的關系
3、假設當前函數已經能用,調用自身計算上一次的結果再求出本次的結果
下面我們通過兩段代碼簡單看一下遞歸和非遞歸的區別:
輸入一個大于等于1的數,求1到n的和!
# 普通函數方法def hanshu(n): sum = 0 # 循環遍歷每一個數字,將他們加到一個事先定義好的變量上,直到加完 for x in range(1, n+1): sum += x return sum
下面看一下通過遞歸的方法:
# 遞歸def digui(n): if n == 1: return 1 # 如果n等于1證明已經遞歸到最后,返回1,這就是上述的臨界條件 else: return n + digui(n-1) # 當沒有達到臨界條件時,用n加上對n-1的遞歸,每次都把n加進去,但是后面依然是使用當下這個遞歸函數,會再次調用計算n-1,直到遞歸結束,也就是將從n到1的數全部遞歸完
在實際應用中,遞歸是十分消耗內存的,但是有些事情他很容易去做,很容易理解。下面,就通過一個案例介紹一下遞歸的用法。
二、遞歸遍歷目錄
下面的內容我就通過解釋代碼來講解了,如果哪里講的不清楚,歡迎大家下方評論提意見。
import os # 由于我們遍歷目錄,所以要找到那個目錄并操作,os模塊包含普遍的操作系統功能path = "" # 這是我們要遍歷的目錄的路徑,需要自己寫進去# 既然是遞歸函數,那么肯定要有個函數,而且這個函數還將在函數內部再次被調用def getAllDir(path, sp = ''): # 參數中傳入路徑和sp,這個我最后說一句你就明白了 # 得到當前目錄下的所有文件 filesList = os.listdir(path) # os.listdir()是os模塊下的一個方法,相當于Linux中的ls,查看所有文件 sp += " " # 這個也先放一下 # 處理每一個文件 for fileName in filesList: # 遍歷剛才找到的目錄下的所有文件 # 判斷是否是目錄(要用絕對路徑) fileAbsPath = os.path.join(path,fileName) # join是os模塊下將兩個路徑拼接在一起的意思,第二個參數不能有斜杠。因為我們要判斷一下這個文件是一個普通文件還是一個目錄,所有要先把他的絕對路徑整理出來 if os.path.isdir(fileAbsPath): # isdir是判斷是否為目錄,是則返回True print(sp + "目錄:", fileName) # 打印當前這個文件,他是個目錄 getAllDir(fileAbsPath,sp = " ") # 這里就開始遞歸了,因為我們要找到整個目錄里的東西,所以當這個文件還是個目錄的時候我們需要繼續向下找 else: print(sp + "普通文件:", fileName) # 如果僅僅是個普通文件,那么他里面也就沒有其他文件了,就可以直接打印他了getAllDir(path) # 這里是調用函數,讓遍歷開始# 最后我來說一下開始寫的那個sp,是space的意思,有人也許現在就明白了。那個其實就是讓我們方便觀察,因為每次打印都是頂行寫的,我們分不清他的目錄結構,所以通過空格來調整。在函數內部寫一個空格增加的表達式,可以使調用次數和空格數相關起來,遞歸的越深,證明目錄的級越低,那么空格越多
新聞熱點
疑難解答