zoukankan      html  css  js  c++  java
  • 递归函数

    递归:就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。简单递归例子:

    def story():
        s = """
        从前有个山,山里有座庙,庙里老和尚讲故事,
        讲的什么呢?
        """
        print(s)
        story()
        
    story()

    查看递归的最大深度为997代码如下:

    n=0
    def f():
        global  n
        print(n)
        n+=1
        f()
    f()

    可以修改递归最大深度但是不建议修改,修改代码如下:

    import sys
    sys.setrecursionlimit(10000000)
    n=0
    def f():
        global  n
        print(n)
        n+=1
        f()
    f()

    递归函数需要需要返回值:也就是每一个都需要return

    比如你问别人的年龄:他不直接告诉你,他会说我的年龄和别人年龄的关系

    def age(n):
        if n==1:
            return 40
        else:
            ret=age(n-1)
            return  ret+2
    r=age(5)
    print(r)
    # def age(n):
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(n-1)
    #         return  ret+2
    # r=age(5)
    # print(r)
    # print(age(5))#48
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(4)#46
    #         return  ret+2#48
    # def age(4):
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(3)#44
    #         return  ret+2#46
    #
    # def age(3):
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(2)#42
    #         return  ret+2#44
    # def age(2):
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(1)#40
    #         return  ret+2#42
    # def age(1):
    #     if n==1:
    #         return 40
    #     else:
    #         ret=age(0)
    #         return  ret+2

    这个代码是对上面递归的分解。

    if和else里都有返回值,还有递归调用谁,就把返回值返回给谁。递归结束的方式是遇到return,还有函数遇到return就结束。

    递归的应用:

    查看数字是否在这个列表里

    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=len(l)//2
        if l[mid]>aim:
            new_l=l[:mid]
            return  find(new_l,aim)
        elif  l[mid]<aim:
            new_l=l[mid+1:]
            return find(new_l,aim)
        else:
            return l[mid]
    print(find(l,43))

    一个数,直到不能被2整除为止:

    def call(num):
       if num%2==0:
           num=num//2
           return call(num)
       else:
         return num
    print(call(6))

    通过二分法查找数字在列表里的索引:

    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,start,end):
        mid=(start+end)//2
        #print(mid)
        if l[mid]>aim:
           end=mid-1
           return  find(l,aim,start,end)
        elif l[mid]< aim:
            start=mid +1
            return find(l,aim,start,end)
        else:
            return mid
    
    
    print(find(l,88,start=0,end=len(l)-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 func(l, aim,start = 0,end = len(l)-1 ):
        mid = (start+end)//2
        if aim  not in l[start:end+1]:
            return
        elif aim > l[mid]:
            return func(l,aim,mid+1,end)
        elif aim < l[mid]:
            return func(l,aim,start,mid-1)
        elif aim == l[mid]:
            print("bingo")
            return mid
    
    index = func(l,100)
    print(index)

    同一个问题的两个解决方法

    总结:递归解决问是通过控制参数来控制每一次调用缩小计算的规模

    适用场合:

    数据规模在减少,但是解决问题的思路没有变

    结束递归的标志:return

  • 相关阅读:
    lsof命令详解
    nmap命令详解
    ss命令详解
    netstat命令详解
    ifup,ifdown命令详解
    playbook部署nginx
    cento7忘记root密码怎么办
    正确关闭selinux
    使用ssh-agent管理私钥
    gitlab中的CI
  • 原文地址:https://www.cnblogs.com/1a2a/p/7264296.html
Copyright © 2011-2022 走看看