zoukankan      html  css  js  c++  java
  • python学习日记(初识递归与算法)

    递归函数

    定义

    递归的定义——在一个函数里再调用这个函数本身

    递归的最大深度——997,即栈溢出。

    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
    递归栈的溢出
    def func(n):
        print(n)
        n += 1
        func(n)
    func(1)

    import sys
    print(sys.setrecursionlimit(100000))
    修改递归最大深度

    例1

    比如你问张三,张三你多大了?张三说他不告诉你,但张三比李四大两岁。

    你想知道张三多大,你是不是还得去问李四?李四说,我也不告诉你,但我比王五大两岁。

    你又问王五,王五r也不告诉你,他说他比赵六大两岁。

    那你问赵六,赵六告诉你,他10岁了。

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

    赵六:10

    王五:12

    李四:14

    张三:16

    age(4) = age(3) + 2 
    age(3) = age(2) + 2
    age(2) = age(1) + 2
    age(1) = 40  

    如果用函数的话,怎么写呢?

    def age(n):
        if n == 1:
            return 10
        else:
            return age(n-1)+2
    print(age(4))

    这就实现了递归。

    例二

    使用递归函数实现阶乘。

    def func(n):
        if n == 1:
            return 1
        else:
            return n * func(n-1)
    print(func(5))

    二分查找算法

    务必详细看,理解每一行,谨记!

    解决的问题有:返回值、end参数,索引

    def fi(list,aim,start = 0,end = None):
        end = len(list)-1 if end is None else end
        mid = (end - start)//2 + start
        if start <= end:
            if list[mid] < aim:
                return fi(list,aim,start = mid+1,end = end)
            elif list[mid] > aim:
                return fi(list,aim,start = start,end = mid-1)
            else:
                return 'found you,aim索引:{},aim:{}'.format(mid,list[mid])
        else:
            return aim,'不在列表中'
    
    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]
    print(fi(l,3))
    def search(li,a):
        start = 0
        end = len(li)-1
        found = False
        while start<=end and not found:
            mid = (end - start) // 2
            if li[mid] == a:
                found = True
            else:
                if li[mid]>a:
                    end = mid-1
                else:
                    start = mid+1
        return found
    l1 = [1,2,3,4,5,6,7,8,9,10,11]
    print(search(l1,0))
    判断是否在列表,是则True,否则False

    pass

    作者:Gruffalo
    ---------------------------------------------
    天行健,君子以自强不息
    地势坤,君子以厚德载物
    内容仅为自己做日常记录,备忘笔记等
    真小白,努力学习ing...一起加油吧!(ง •̀_•́)ง
  • 相关阅读:
    爬虫_requests
    第十四周总结
    《三个和尚》观看感悟
    第十三周总结
    ThinkPHP
    ThinkPHP配置安装
    ThinkPHP_1
    构建之法阅读笔记六
    网络工程师必备学习内容!深度理解OSPF——OSPF是什么?为什么要用OSPF?
    网络工程师学习笔记——RIP路由汇总实验配置
  • 原文地址:https://www.cnblogs.com/smallfoot/p/10073669.html
Copyright © 2011-2022 走看看