一、遞歸的特色算法
遞歸算法是一種直接或間接調用自身算法的過程,在計算機編程中,遞歸算法對解決一大類問題是十分,它每每使算法的描述簡潔並且易於理解。編程
遞歸算法解決問題的特色:數組
(1)遞歸就是在過程或函數裏調用自身函數
(2)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。spa
(3)遞歸算法解題一般顯得很簡潔,但遞歸算法解題的運行效率較低,因此通常不提倡用遞歸算法設計程序。設計
(4)在遞歸調用的過程當中系統爲每一層的返回點、局部量等開闢了棧來存儲,遞歸次數過多容易形成棧溢出等。code
二、遞歸的要求blog
遞歸算法所體現的「重複」通常有三個要求:遞歸
(1)每次調用在規模上都有所縮小(一般是減半)it
(2)是相鄰兩次重複之間有緊密的聯繫,前一次要爲後一次作準備(一般前一次的輸出做爲後一次的輸入)
(3)在問題的規模極小時必須用直接給出解答而再也不進行遞歸調用,於是每次遞歸調用都是有條件的(以規模位達到直接解答的大小爲條件)無條件遞歸調用將會成爲死循環而不能正常結束。
簡單的遞歸函數實例:
def recursion(i): #定義函數 print(i) if i/2 > 1: #判斷遞歸條件,退出 re = recursion(i/2) #遞歸函數自身 print('返回值:',re) print('上層遞歸值:',i) return i #返回值 recursion(10) #運行原理:首先運行函數傳參10給函數,打印10,判斷條件知足,遞歸 #函數參數值爲(10/2)5,打印i的值5,等遞歸到1.25時,判斷條件不滿 #足後,纔打印上層遞歸的值,此時遞歸的值爲1.25,return遞歸最後一 #層的值1.25,退出最後一層遞歸,繼續一層層退出遞歸,最後返回最上層 #遞歸值結束函數。 10 5.0 2.5 1.25 上層遞歸值: 1.25 返回值: 1.25 上層遞歸值: 2.5 返回值: 2.5 上層遞歸值: 5.0 返回值: 5.0 上層遞歸值: 10
斐波那契數列:就是前兩個數的和爲後一個數的值(0,1,1,2,3,5,8,13.........)
def foo(arg1,arg2,stop): if arg1 == 0: print(arg1,arg2) arg3 = arg1 + arg2 print(arg1,arg2,arg3) if arg3 < stop: #判斷套件不知足時退出遞歸 foo(arg2,arg3,stop) #遞歸函數,傳送參數arg2,arg3,stop給arg1,arg2,stop foo(0,1,50) 0 1 0 1 1 1 1 2 1 2 3 2 3 5 3 5 8 5 8 13 8 13 21 13 21 34 21 34 55
利用切片遞歸方式,查找數據:
def twosplit(sourceDate,findData): sp = int(len(sourceDate)/2) #序列長度 if sourceDate[0] == findData: print('找到數據:',sourceDate[0]) return 0 else: if findData in sourceDate[:sp]: #判斷在左邊 print('數據在左邊[%s]' %sourceDate[:sp]) twosplit(sourceDate[:sp],findData) #遞歸函數 elif findData in sourceDate[sp:]: #判斷在右邊 print('數據在右邊[%s]' %sourceDate[sp:]) twosplit(sourceDate[sp:], findData) else: print('找不到數據') if __name__ == '__main__': data = [1,2,'c',3,4,5,6,7,8,17,26,15,14,13,12,11,'a','b'] #data = list(range(1000000)) twosplit(data,'c')
二位數組,順時針90度數據調換:
a = [[col for col in range(4)] for row in range(4)] for i in a:print(i) #打印二維數組 print('--------------------') for lf,rig in enumerate(a): #循環數組,打印數組下標和元素 for cf in range(lf,len(rig)): #從下標數組開始循環到列表長度 tmp = a[cf][lf] #存儲列表元素中的元素 a[cf][lf] = rig[cf] a[lf][cf] = tmp print('+++++++++++++++++') for i in a:print(i) '''#另外一種方法 for i in range(len(a)): ai = [a[i][i] for row in range(4)] print(ai) '''