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)
    
  • 相关阅读:
    关于Java的i++和++i的区别
    Java基础(八 前面补充)
    Java基础(七)
    Java基础(六)
    Java基础(五)
    Java基础(四)
    Java基础(三)
    Java基础(二)
    Java基础
    阿里技术专员《并发编程技术分享》
  • 原文地址:https://www.cnblogs.com/luchuangao/p/6708605.html
Copyright © 2011-2022 走看看