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

    一、定义

      在函数内部调用自己的函数

    二、示例

      1.如果没有结束条件地调用自己,就会浪费内存,超过之后就会RecursionError报错(递归报错)

    def deff():
        print("cc")
        deff()
    
    deff()
    #RecursionError: maximum recursion depth exceeded while calling a Python object

      默认递归最大深度(997),但是最大递归深度可以修改

    import sys
    sys.setrecursionlimit(2000)
    a=0
    def deff():
        global a
        a=a+1
        print(a)
        deff()
    
    deff()
    #1996
    #如果不设置就是996/997

      #如果递归次数太多就不建议使用递归,非常占内存

      #优点是可以优化代码,更简洁

      2.一个编程示例,不能直接得到答案,通过另外的结果来求解,并且两个求解方式是相同的

      求4的阶乘(4!)的值。(return很重要)如果第二个不写rerurn,就会返回none

    def deff2(n):
        global s
        s=n*s
        n=n-1
    if n==1: return s #保证可以出去递归 else: return deff2(n) #保证下一层递归执行,并且有返回值 s=1 se=deff2(4) print(se)

     三、算法

      二分查找算法(必须处理有序的列表)

      #减小工作量,如果是连续的、有序的值,找到想要的数

      1.v1.0

    l=[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,44,45,46,47,48,49,55,57,59,66]
    def findnum(l,aim):
        mid_index=len(l)//2  #整除,得到一个整数
        if l[mid_index] <aim:
            new_l=l[mid_index+1:]
            findnum(new_l,aim)
    
        elif l[mid_index ]>aim:
            new_l=l[:mid_index]   #本身在前
            findnum(new_l,aim)
    
        else:
            print("aim  ",mid_index,l[mid_index])
    
    findnum(l,18)
    #此时下标不准  aim   1 18

      2.v2.0

    l=[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,44,45,46,47,48,49,55,57,59,66]
    def findnum(l,aim,start=0,end=len(l)):
        mid_index=(end-start)//2+start  #从start开始往后加
        if l[mid_index] <aim:
            findnum(l,aim,start=mid_index+1,end=end)
    
        elif l[mid_index ]>aim:
            findnum(l,aim,start=start,end=mid_index-1)  #没有切片,应该-1
    
        else:
            print("aim  ",mid_index,l[mid_index])
    
    findnum(l,7)
    print(l.index(7))   #一个效果
    #此时假如找不到,就会报错

      3.v3.0

     

    l=[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,44,45,46,47,48,49,55,57,59,66]
    def findnum(l,aim,start=0,end=None):   #不能提前预知会传给什么参数,让定义l可以在函数后面
        end=len(l)if end is None else end   #如果是传入了就传入,如果没传入就有默认的None
        mid_index=(end-start)//2+start  #从start开始往后加,//向下取整
        if start<=end:
            if l[mid_index] <aim:
                findnum(l,aim,start=mid_index+1,end=end)
                
            elif l[mid_index ]>aim:
                findnum(l,aim,start=start,end=mid_index-1)  #没有切片,应该-1
    
            else:
                print("aim  ",mid_index,l[mid_index])   #层层返回,这里不能返回,否则返回None
        else:
            print("找不到 %s这个值"%aim)
    
    findnum(l,12)
    #此时差不多了,但是返回的问题不清楚

    4.v4.0

    l=[1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,44,45,46,47,48,49,55,57,59,66]
    def findnum(l,aim,start=0,end=None):   #不能提前预知会传给什么参数,让定义l可以在函数后面
        end=len(l)if end is None else end   #如果是传入了就传入,如果没传入就有默认的None
        mid_index=(end-start)//2+start  #从start开始往后加,//向下取整
        if start<=end:
            if l[mid_index] <aim:
                return findnum(l,aim,start=mid_index+1,end=end)
    
            elif l[mid_index ]>aim:
                return findnum(l,aim,start=start,end=mid_index-1)  #没有切片,应该-1
    
            else:
                return mid_index   #要返回就全部都要返回
        else:
            return "找不到 %s这个值"%aim
    
    print(findnum(l,20))
    #完美
  • 相关阅读:
    cad是什么意思?教你快速把cad转换成pdf格式
    为什么街上的商贩更喜欢用微信支付,而不是支付宝,看完长知识了
    音乐剪辑软件怎么用?教你一个快速编辑音频的方法
    电脑如何录制视频?安利两种电脑录屏的方法
    被称为逆天改命的5大中国工程,曾轰动世界,你知道几个?
    如何使用音乐格式转换器?快速编辑音频文件的方法
    PPT结尾只会说“谢谢”?学会这些PPT结尾,观众主动为你鼓掌
    经典PHP面试题(冒泡排序),当场就被打脸,卧槽什么冒泡?为啥还排序?
    千万不要再搞混了,函数empty( var );输出的判断值是false : true
    PHP删除数组中空数组
  • 原文地址:https://www.cnblogs.com/lowislucifer/p/11290558.html
Copyright © 2011-2022 走看看