• 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 '找不到这个值'
    完整版
    
    
    
  • 相关阅读:
    我的第九个java程序--spring和mybatis整合(java project)
    php 批量插入字段
    php 遍历静态html成文章列表
    把world转成html
    java 读取world的图片 并把图片路径存入数据库
    我的第八个java程序--读取word内容
    我的第7个java程序--把java web项目改为java project项目--mybatis
    我的第六个java程序 spring-bean
    学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用
    学习spring1--跟我一起学Spring 3(2)–开发环境配置
  • 原文地址:https://www.cnblogs.com/lpgit/p/9379655.html
Copyright © 2020-2023  润新知