13_Python遞歸函數(shù)_全棧開發(fā)學習筆記

1. 初識遞歸

什么是遞歸:在函數(shù)中調用自身函數(shù)
最大遞歸深度默認是997/998 —— 是python從內存角度出發(fā)做得限制


遞歸演示范例:

def story():
    print("從前有座山")
    story()
story()


1.1 遞歸報錯信息

RecursionError: maximum recursion depth exceeded while calling a Python object
上句是遞歸的錯誤,超過了遞歸的最大深度


1.2 破除默認深度997

但能跑多少次,看每臺電腦的內存大小。

import sys
sys.setrecursionlimit(1000000)

n = 0
def story():
    global n
    n += 1
    print(n)
    story()
story()


1.3 遞歸結論

如果遞歸次數(shù)太多,就不適合使用遞歸來解決問題
遞歸的缺點 : 占內存
遞歸的優(yōu)點: 會讓代碼變簡單


1.4 遞歸例子

題目:

alex 多大       n = 1   age(1) = age(2)+2 = age(n+1) + 2
alex比egon大兩歲
egon多大?      n = 2   age(2) = age(3) + 2 = age(n+1) +2
egon比wusir大兩歲
wusir多大       n = 3   age(3) = age(4) + 2 = age(n+1) +2
wusir比金老板大兩歲
金老板多大?
金老板40了      n = 4   age(4) = 40

n = 4 age(4) = 40
n <4  age(n) = age(n+1) +2

范例:
計算年齡

def age(n):
    if n == 4:
        return 40
    elif n >0 and n < 4:
        return age(n+1) + 2

print(age(1))

執(zhí)行結果:

46


如何看遞歸:

# def age(1):
#     if 1 == 4:
#         return 40
#     elif 1 > 0 and 1 < 4:
#         return 46
#
# def age(2):
#     if 2 == 4:
#         return 40
#     elif 2 >0 and 2 < 4:
#         age(3) + 2    None +2
#
# def age(3):
#     if 3 == 4:
#         return 40
#     elif 3 >0 and 3 < 4:
#         42
#
# def age(4):
#     if 4 == 4:
#         return 40
#     elif n >0 and n < 4:
#         age(n+1) + 2

2. 初識算法

什么叫算法
計算的方法 : 人腦復雜 計算機簡單


99 * 13 = 1287 = 13*100 - 13
查找 : 找數(shù)據(jù)
排序 :
最短路徑


我們學習的算法 都是過去時
了解基礎的算法 才能創(chuàng)造出更好的算法
不是所有的事情都能套用現(xiàn)成的方法解決的
有些時候會用到學過的算法知識來解決新的問題


二分查找算法 必須處理有序的列表
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

范例1.1:
有問題的代碼---是因為每次都會換索引

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def find(l,aim):
    mid_index = len(l) // 2
    if l[mid_index] < aim:
        new_l = l[mid_index+1 :]
        find(new_l,aim)
    elif l[mid_index] > aim:
        new_l = l[:mid_index]
        find(new_l, aim)
    else:
        print('找到了',mid_index,l[mid_index])

find(l,66)

執(zhí)行結果:

找到了 0 66


范例1.2:
代碼完善

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end - start)//2 + start
    if start <= end:
        if l[mid_index] < aim:
            return find(l,aim,start =mid_index+1,end=end)
        elif l[mid_index] > aim:
            return find(l, aim, start=start, end=mid_index-1)
        else:
            return mid_index,aim
    else:
        return '找不到這個值'


ret= find(l,44)    # 找不到
print(ret)
ret= find(l,66)    # 發(fā)生好幾次
print(ret)
ret= find(l,67)    # 發(fā)生兩次調用
print(ret)

執(zhí)行結果:

找不到這個值
(17, 66)
(18, 67)

3. 總結

超過最大遞歸限制的報錯
只要寫遞歸函數(shù),必須要有結束條件。


返回值
不要只看到return就認為已經返回了。要看返回操作是在遞歸到第幾層的時候發(fā)生的,然后返回給了誰。
如果不是返回給最外層函數(shù),調用者就接收不到。
需要再分析,看如何把結果返回回來。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容