python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

一. 递归函数

  如果一个函数在内部调用自身本身,这个函数就是递归函数。

 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改
def func(n):
    print(n)
    func(n+1)
func(1)
查看最大递归深度
‘’‘
改变最大递归深度,根据自身电脑配置,深度各不相同
’‘’
import sys
sys.setrecursionlimit(1000000)
修改最大递归深度

举个例子:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。

那你问金鑫,金鑫告诉你,他40了。。。

这个时候你是不是就知道了?alex多大?

age(4) = age(3) + 2 
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40
分析
def age(n):
    if n == 4:
        return 40
    elif n > 0 and n < 4:
        return age(n+1) + 2
print(age(1))
def age(1):
    if 1 == 4:
        return 40
    elif 1 > 0 and 1 < 4:
        return age(1+1) + 2         返回给age(1)

def age(2):
    if 2 == 4:
        return 40
    elif 2 > 0 and 2 < 4:
        return age(2+1) + 2         返回给上一个的age(1+1)

def age(3):
    if 3 == 4:
        return 40
    elif 3 > 0 and 3 < 4:
        return age(3+1) + 2        返回给上一个的age(2+1)

def age(4):
    if 4 == 4:
        return 40
    elif 4 > 0 and 4 < 4:
        return age(4+1) + 2     返回给上一个的age(3+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)
基础版
def find(l,aim,start = 0,end = len(l)):
    mid_index = (end - start) // 2 + start      # 计算中间值
    if l[mid_index] < aim:
        find(l,aim,start = mid_index + 1,end = end)
    elif l[mid_index] > aim:
        find(l, aim, start=start, end= mid_index - 1)
    else:
        print('找到了',mid_index,l[mid_index])
find(l,66)              # 找到了 17 66
升级版
有问题:
  1. 参数 end
  2. 返回值
  3. 找不到怎么办?
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
    else:
        return '找不到这个值'
完整版


原文地址:https://www.cnblogs.com/lpgit/p/9379655.html