python3之遞歸


1、遞歸的特點

遞歸算法是一種直接或間接調用自身算法的過程,在計算機編程中,遞歸算法對解決一大類問題是十分,它往往使算法的描述簡潔而且易於理解。

遞歸算法解決問題的特點:

(1)遞歸就是在過程或函數里調用自身

(2)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。

(3)遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低,所以一般不提倡用遞歸算法設計程序。

(4)在遞歸調用的過程中系統為每一層的返回點、局部量等開辟了棧來存儲,遞歸次數過多容易造成棧溢出等。

2、遞歸的要求

遞歸算法所體現的“重復”一般有三個要求:

(1)每次調用在規模上都有所縮小(通常是減半)

(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)
'''


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM