13_Python递归函数_全栈开发学习笔记

1. 初识递归

什么是递归:在函数中调用自身函数
最大递归深度默认是997/998 —— 是python从内存角度出发做得限制


递归演示范例:

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 递归结论

如果递归次数太多,就不适合使用递归来解决问题
递归的缺点 : 占内存
递归的优点: 会让代码变简单


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

执行结果:

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
查找 : 找数据
排序 :
最短路径


我们学习的算法 都是过去时
了解基础的算法 才能创造出更好的算法
不是所有的事情都能套用现成的方法解决的
有些时候会用到学过的算法知识来解决新的问题


二分查找算法 必须处理有序的列表
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)

执行结果:

找到了 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)    # 发生好几次
print(ret)
ret= find(l,67)    # 发生两次调用
print(ret)

执行结果:

找不到这个值
(17, 66)
(18, 67)

3. 总结

超过最大递归限制的报错
只要写递归函数,必须要有结束条件。


返回值
不要只看到return就认为已经返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。
如果不是返回给最外层函数,调用者就接收不到。
需要再分析,看如何把结果返回回来。

你可能感兴趣的:(13_Python递归函数_全栈开发学习笔记)