zoukankan      html  css  js  c++  java
  • python基础之递归、二分法

     一 递归

    1. 必须有一个明确的结束条件
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,
    函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
    栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
    所以,递归调用的次数过多,会导致栈溢出)

    注:栈遵循先进后出,先吃后拉原则。

      递归能干得事,while True都能干。

    查看和修改栈的大小:

    >>> import sys
    >>> sys.getrecursionlimit()
    1000
    >>>
    >>> sys.setrecursionlimit(10000)
    >>> sys.getrecursionlimit()
    10000
    >>>
    

     递归初识:

    part1:

    def test():
        test()
    test()

    输出结果:

    #part2:

    #:有一个明确的结束条件
    def test(n):
        print(n)
        n = n -1
        if n >=1:
            test(n)
    test(5)

    输出结果:

    #part3

    def calc(n):
        print(n)
        if int(n/2)==0:
            return n
        return calc(int(n/2))
    print('********',calc(10))

    输出结果:

     

    #part4

    # 5 = 5*4*3*2*1(实现阶乘)

    def func(num):
        if num==1:
            return 1
        if num>1:
            return func(num-1)*num
    k = func(5)  
    print(k)

    输出结果:

    分析过程:

    """
    def func(num):
        if num==1:
            return 1
        if num>1:
            return func(num-1)*num
    k = func(5)  
    print(k)                   #最后k等于120
    
    def func(5):
        if 5==1:
            return 1
        if 5>1:
            return func(4)*5   #返回时func(4) 等于 24 , func(4)*5
    
    def func(4):
        if 4==1:
            return 1
        if 4>1:
            return func(3)*4   #返回时func(3) 等于 6 , func(3)*4 等于 24
    
    def func(3):
        if 3==1:
            return 1
        if 3>1:
            return func(2)*3   #返回时func(2) 等于 2 , func(2)*3 等于 6
    
    def func(2):
        if 2==1:
            return 1
        if 2>1:
            return func(1)*2   #返回时func(1) 等于 1 , func(1)*2 等于 2
    
    def func(1): 
        if 1==1:
            return 1           #最终得出结论func(1) 等于 1,开始返回
    """

    使用实例:

    猜年龄游戏:

    小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。

    又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、

    又问小青多大,小青说10岁了。问小黄现在多大?

    分析:

    age(5)=age(4)+2   n=5 age(n)=age(n-1)+2
    age(4)=age(3)+2   n=4 age(n)=age(n-1)+2
    age(3)=age(2)+2   n=3 age(n)=age(n-1)+2
    age(2)=age(1)+2   n=2 age(n)=age(n-1)+2
    age(1)=10       n=1 age(n)=10

    n=1 res=10
    n>1 res=age(n-1)+2

    答案:

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

    二 二分法

    猜数字是否在列表内游戏:

    # data=[]
    # for i in range(1,100000,2):
    #    data.append(i)
    
    
    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    # num=19
    # i=0
    # while True:
    #     if num == data[i]:
    #         print('find it')
    #         break
    #     i+=1
    
    def search(num,data):
        print(data)
        if len(data) > 1:
            #二分
            mid_index=int(len(data)/2)
            mid_value=data[mid_index]
            if num > mid_value: #19>18
                #num在列表的右边
                data=data[mid_index:] #data[0:]-->[18]
                search(num,data)
            elif num < mid_value:
                #num在列表的左边
                data=data[:mid_index]
                search(num,data)
            else:
                print('find it')
                return
        else:
            if data[0] == num:
                print('find it')
            else:
                print('not exists')
    
    # search(9527,data)
    search(15,data)
    # search(1,data)
    
  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/luchuangao/p/6708605.html
Copyright © 2011-2022 走看看