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

    递归函数:函数本身自己调用自己,最大的调用层数为998(可以import sys模块   sys.setrecursionlimit(1000000)  增加调用层数)所以需要设置一个明确的断点;

    递归函数的理解:看递归函数的时候,最简单的方法,就是抽丝剥茧,一层函数一层函数的来看,比如下面例子中 斐波那契数列思路二;

    递归的使用:递归比较少用得到,基本上日常用到的递归,都可以用循环解决。

    实例:

    import sys
    sys.setrecursionlimit(1000000)
    n = 0
    def story():
        global n
        n +=1
        print(n)
        story()
    story()
    递归入门-tellstory
    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=0,end = None):
        end = len(l)-1 if end == None else end   #find(l,99,start=14,end = 26)
        print('end>>>>',end)
        mid_index = (end-start)//2 + start #中间值 24
        print('start>>>>', start)
        print('mid_index>>>>',mid_index)
        if start <= end:
            if l[mid_index]  < aim :              # 比较 88 和 99
                print(l[mid_index],'
    ')
                return find(l,aim,start=mid_index+1,end=end)  #find(l,99,start=25,end = 25)
            elif l[mid_index] > aim :
                print(l[mid_index],'
    ')
                return find(l,aim,start=start,end=mid_index-1)
            else:
                print(l[mid_index],'
    ')
                return mid_index     #注意此处return是要返回给上一级函数的,不能在此处加多余字符串
        else:
            return '找不到'
    
    print(find(l,88))
    二分法查找
    #两种思路
    #1,用双递归,比较占用运行空间,不过简单易懂:
    def fibo(n):
        if n == 1 or n == 2:
            return 1
        else:
            return fibo(n-1) + fibo(n-2)
    print(fibo(10))
    
    #2,用单递归,效率快,不过比较绕
    def fibo2(n,l=[0]):
        l[0] += 1
        if n == 1 or n == 2:
            l[0] -= 1
            if l[0] == 0:
                return 1
            return 1,1
        else:
            a,b =fibo2(n-1)
            l[0] -= 1
            if l[0] == 0 :
                return a+b
            return b,a+b
    print(fibo2(100))
    斐波那契数列
    #以fibo2(4)为例进行分析
    # def fibo2(4,l=[0]):               #得到返回值4
    #     l[0] += 1            #1
    #     if n == 1 or n == 2:
    #         l[0] -= 1
    #         if l[0] == 0:
    #             return 1
    #         return 1,1
    #     else:
    #         a,b =fibo2(3)   # a,b = fibo2(3)
    #         l[0] -= 1
    #         if l[0] == 0 :
    #             return a+b
    #         return b,a+b
    #
    #
    # def fibo2(3,l=[0]):
    #     l[0] += 1            #  2
    #     if n == 1 or n == 2:
    #         l[0] -= 1
    #         if l[0] == 0:
    #             return 1
    #         return 1,1
    #     else:
    #         a,b =fibo2(n-1)  # a,b = fibo2(2)    #1,2 返回回来 往下执行
    #         l[0] -= 1        #  0
    #         if l[0] == 0 :
    #             return a+b   #3  返回1+2,给fibo2(4)
    #         return b,a+b
    #
    # def fibo2(2,l=[0]):
    #     l[0] += 1            #  3
    #     if n == 1 or n == 2:
    #         l[0] -= 1        #2  此处l[0]因为 n==2要减1
    #         if l[0] == 0:
    #             return 1
    #         return 1,1
    #     else:
    #         a,b =fibo2(n-1)  # a,b = fibo2(2)   # 1,1返回给 a,b,然后往下执行
    #         l[0] -= 1        # 1   此处继续减1,l[0]变为1
    #         if l[0] == 0 :
    #             return a+b
    #         return b,a+b    # 1,2   #返回给 b,a+b       这个再继续返回给fibo2(3)
    # print(fibo2(4))
    斐波那契思路二分析
    #!/usr/bin/env python
    #-*-coding=utf-8 -*-
    #GKX
    
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    
    #堆栈的思想
    # l = [menu]
    # while l:
    #     for key in l[-1]:
    #         print(key)
    #     k = input('input>>').strip()   # 北京
    #     if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
    #     elif k == 'b':
    #         l.pop()
    #     elif k == 'q':
    #         break
    
    #递归的思想
    def three_level_menu(menu):
        while True:
            for key in menu:
                print(key)
            k=input('>>>')
            if k=='q':return 'q'
            elif k=='b':break
            elif k in menu:
                ret=three_level_menu(menu[k])
                if ret=='q':return 'q'
    three_level_menu(menu)
    三级菜单
    #阶乘
    def fac(n):
        if n == 1:
            return 1
        else:
            return n*fac(n-1)
    print(fac(10))
    阶乘
  • 相关阅读:
    MySQL--mysqldump的权限说明
    JS--switch 语句
    psutil官方文档
    mysql 性能分析套件
    mysql 在启动时配置文件的查找方式
    mysql中的意向锁IS,IX
    mysql innodb_double_write特性
    mysql sql_mode 之 NO_ENGINE_SUBSTITUTION
    编译安装hph
    pip list 和 pip freeze
  • 原文地址:https://www.cnblogs.com/gkx0731/p/9577851.html
Copyright © 2011-2022 走看看