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

    递归函数
    mport sys #所有和python相关的设置和方法
    sys.setrecursionlimit(10000000)
    n = 0
    def f():
        global n
        n += 1
        print(n)
        f()
    
    f()
    View Code
    
    
    def story():
        print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
    while True:
       story()
    老和尚讲故事
    递归:
    在一个函数里调用自己
    python递归最大层数限制 997
    最大层数限制是python默认的,可以做修改
    但是不建议你修改
    递归实例:
    def age(n):
        if n == 1:
            return 40
        else:
            ret = age(n-1)
            return ret + 2
    age(5)
    算年龄
    结束递归的标志:return
    递归三级菜单:
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    
    def threeLM(menu):
        for key in menu:
            print(key)
        k = input(">>>")
        if k in menu:
            threeLM(menu[k])
    
    threeLM(menu)
    三级菜单
    递归二分法:
    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(l.index(66))
    num = 0
    for i in l:
        if i == 66:
            print(num)
        num += 1
    View Code
    
    
    l = [2,3,5,10,15,16,18,22,26]
    def find(l,aim):              #l:列表 aim:要找的
        mid = len(l)//2          #计算中点
        if l[mid] > aim:         #  判断中间位置的值和目标值的大小关系
            new_l = l[:mid]    #[16,18] = [16,18,22,26][: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,16))
    取数
    l = [2,3,5,10,15,16,18,22,26]
    def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26]  0,8
        mid = (end+start)//2  #4   #5+8/2=6  #start =5 end = 5 mid = 5
        if start <  end:
            if l[mid] > aim:  #15  17  #18 17
                end = mid -1  #end =6-1 = 5
                return find2(l,aim,start,end)
            elif l[mid] < aim: #15  17
                start = mid + 1  # start = 5
                return find2(l, aim, start, end)
            else:
                return mid
        else:
            return "找不到"
    
    print(find2(l,18,start=0,end = len(l)-1))
    View Code
    递归解决的问题
    就是通过参数,来控制每一次调用缩小计算的规模
    适合的场景
    数据的规模在减小,但是解决问题的思路没有改变
    结束递归的标志:return
    def func(num):
        print(num)
        if num == 1:
            return
        if num %2 == 0:
            num = num //2
        else:
            num = num * 3 + 1
        func(num)
    
    func(5)
    如果一个数 可以整除2 就整除 不能整除就*3+1
    
    
    
     
    
    
     


  • 相关阅读:
    获取 iPhone 上联系人姓名、电话、邮件的代码
    NSDate常用代码范例
    iphone开发之多线程NSThread和NSInvocationOperation
    iphone 定时提醒
    iphone 程序自动登陆
    搞定大厂算法面试之leetcode精讲11剪枝&回溯
    大厂算法面试之leetcode精讲7.双指针
    大厂算法面试之leetcode精讲8.滑动窗口
    大厂算法面试之leetcode精讲15.链表
    大厂算法面试之leetcode精讲10.递归&分治
  • 原文地址:https://www.cnblogs.com/mengqingjian/p/7274674.html
Copyright © 2011-2022 走看看