zoukankan      html  css  js  c++  java
  • day15 函数的使用方法:递归函数

    这里归纳的知识点主要就是:

    浮点数,复数,

    int,整形;float,浮点数;complx,复数;

     1 # 实数:
     2     # 有理数  有限小数     1.2
     3     #         无限循环小数  1.23232323232323.....
     4     # 无理数  无限不循环小数
     5 #浮点数-小数
     6 #浮动
     7 #1.2 = 12*0.1
     8 #1.2 = 0.12*10
     9 
    10 # py2和3的区别
    11 # print(1/2)
    12 
    13 #浮点数的特点
    14 # a = 1.15346974071908269370703493
    15 # print(a)
    16 
    17 #float
    18 # print(float('1.234'))
    19 
    20 #复数   a+bj   实部+虚部
    21 #  实数 :1
    22 #  虚数 :j
    23 #平方是-1的数就是j
    24 "-1"
    25 #复数:
    26 # 复数之间不能比较大小
    27 # 2+3j
    28 # 2+3J
    29 # complex
    View Code

    递归函数

    初识递归:

    # def story():
    #     print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?')
    
    #功能解耦:
    #为什么要有函数:提高代码可读性,避免重复的代码,提高代码的复用性
    #在函数中能return的不要print
    # while True:
    #     story()
    
    # def story():
    #     print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?')
    #     story()
    #
    # story()
    # import sys
    # # print(sys.getrecursionlimit())
    # sys.setrecursionlimit(2000000000)
    # n = 0
    # def func():
    #     global n
    #     n+=1
    #     print(n)
    #     func()
    # func()
    
    #递归
    #在一个函数里面 调用 自己
    #默认的递归最大限度 1000
    #不要修改默认的递归最大限度
    #往往 递归 都是 和循环挂在一起的
    # 人理解循环 神理解递归
    # 算法,递归函数
    # 认识递归
    # 递归函数怎么读?
    # 带着你写两段代码
    
    #多大了alex,我不告诉你,alex比egon大两岁    44+2
    #egon多大了,我不告诉你,egon比wusir大两岁   42+2
    #wusir多大了,我不告诉你,wusir比金鑫大两岁  40+2
    #金鑫40了
    
    # age(1) n = 1 age(2)+2
    # age(2) n = 2 age(3)+2
    # age(3) n = 3 age(4)+2
    # age(4) n = 4 40
    
    def age(n):
        if n == 4:
            return 40
        return age(n+1)+2
    
    print(age(0))
    
    # def age(0):
    #     if n == 4:
    #         return 40
    #     return age(1)+2               #48
    
    # def age(1):
    #     if 1 == 4:
    #         return 40
    #     return age(2)+2                #46   这个46返回给上面的return age(1)+2
    #
    # def age(2):
    #     if 2 == 4:
    #         return 40
    #     return age(3)+2         # 44   这个44返回给上面的return age(2)+2
    #
    # def age(3):
    #     if 3 == 4:
    #         return 40
    #     return age(4)+2    #return 42  这个42返回给上面的return age(3)+2
    #
    # def age(4):
    #     if 4 == 4:
    #         return 40     这个40返回给上面的return age(4)+2
    #     # age(n+1)+2
    View Code

    二分查找算法:

    #算法:一种计算的方法
    # 3+2
    # 3*2+5
    # 99*28  == (100-1)*28 == 28*100 - 28
    # 典型问题:冒泡排序,快速排序,堆排序
    # 查找算法
    
    # 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))
    # index = 0
    # for i in l :
    #     if i == 66:
    #         print(index)
    #     index += 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]
    
    #二分查找算法
    #66
    # def find(lst,aim):
    #     mid = len(lst)//2
    #     if lst:
    #         if aim > lst[mid]:
    #             new_lst = lst[mid+1:]
    #             find(new_lst,aim)
    #         elif aim < lst[mid]:
    #             new_lst = lst[:mid]
    #             find(new_lst, aim)
    #         else:
    #             print(aim,mid)
    #     else:
    #         print('您要找的值不存在')
    # find(l,36)
    
    # def find(lst,66): #lst = [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]
    #     mid = len(lst)//2  #mid = 12 = 25//2
    #     if lst:
    #         if 66 > 41:
    #             new_lst = lst[mid+1:]   #new_lst = [42,43,55,56,66,67,69,72,76,82,83,88]
    #             find(new_lst,aim)       #find([42,43,55,56,66,67,69,72,76,82,83,88],66)
    #     else:
    #         print('您要找的值不存在')
    #
    # def find(lst,aim):   #lst = [42,43,55,56,66,67,69,72,76,82,83,88],66
    #     mid = len(lst)//2   #mid = 12//2 = 6
    #     if lst:
    #         if 66 > 69:     #66
    #             new_lst = lst[mid+1:]
    #             find(new_lst,aim)
    #         elif 66 < 69:
    #             new_lst = lst[:mid]   #[42,43,55,56,66,67]
    #             find(new_lst, aim)    #find([42,43,55,56,66,67],66)
    #     else:
    #         print('您要找的值不存在')
    #
    #
    # def find(lst,aim):    #[42,43,55,56,66,67],66
    #     mid = len(lst)//2    #mid = 3
    #     if lst:
    #         if 66 > 56:
    #             new_lst = lst[mid+1:]  #66,67
    #             find(new_lst,aim)      #find([66,67],66)
    #         elif aim < lst[mid]:
    #             new_lst = lst[:mid]
    #             find(new_lst, aim)
    #         else:
    #             print(aim,mid)
    #     else:
    #         print('您要找的值不存在')
    #
    # def find(lst,aim):    #[66,67],66
    #     mid = len(lst)//2    #mid = 1
    #     if lst:
    #         if 66 > 67:
    #             new_lst = lst[mid+1:]
    #             find(new_lst,aim)
    #         elif 66 < 67:
    #             new_lst = lst[:mid]  #[66]
    #             find(new_lst, aim)   #find([66],66)
    #         else:
    #             print(aim,mid)
    #     else:
    #         print('您要找的值不存在')
    #
    # def find(lst,aim):    #[66],66.5
    #     mid = len(lst)//2    #mid = 0
    #     if lst:
    #         if 66 > 66:
    #             new_lst = lst[mid+1:]
    #             find(new_lst,aim)
    #         elif 66 < 66.5:
    #             new_lst = lst[:mid]  #[]
    #             find(new_lst, aim)   #find([],66)
    #         else:
    #             print(aim,mid)
    #     else:
    #         print('您要找的值不存在')
    
    # def find_2(l,aim,start=0,end=None):  #[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]
    #     if end == None:end = len(l) - 1  #start = 0,end = 24
    #     if start <= end:
    #         mid = (end-start) // 2  + start  #mid = 12
    #         if l[mid] > aim:
    #             find_2(l,aim,start,mid-1)
    #         elif l[mid] < aim:              #
    #             find_2(l,aim,mid+1,end)     #find_2(l,58,13,24)
    #         else:
    #             print(aim,mid)
    #     else:
    #         print('找不到这个值')
    # 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]
    # find_2(l,58)
    
    #如果要找的值不存在
    #返回值的问题
    
    # def find_2(l,aim,start=0,end=None):  #[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]
    #     if end == None:end = len(l) - 1  #start = 13,end = 24
    #     mid = (end-start) // 2  + start  #mid = 18
    #     if l[mid] > aim:
    #         find_2(l,aim,start,mid-1)    #find_2(l,58,13,17)
    #     elif l[mid] < aim:
    #         find_2(l,aim,mid+1,end)
    #     else:
    #         print(aim,mid)
    #
    # def find_2(l,aim,start=0,end=None):  #[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]
    #     if end == None:end = len(l) - 1  #start = 13,end = 17
    #     mid = (end-start) // 2  + start  #mid = 15
    #     if l[mid] > aim:
    #         find_2(l,aim,start,mid-1)
    #     elif l[mid] < aim:
    #         find_2(l,aim,mid+1,end)      #find_2(l,58,16,17)  [56,66]
    #     else:
    #         print(aim,mid)
    #
    # def find_2(l,aim,start=0,end=None):  #[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]
    #     if end == None:end = len(l) - 1  #start = 16,end = 17
    #     mid = (end-start) // 2  + start  #mid = 16
    #     if l[mid] > aim:
    #         find_2(l,aim,start,mid-1)
    #     elif l[mid] < aim:
    #         find_2(l,aim,mid+1,end)      #find_2(l,58,17,17)  [56,66]
    #     else:
    #         print(aim,mid)
    #
    # def find_2(l,aim,start=0,end=None):  #[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]
    #     if end == None:end = len(l) - 1  #start = 17,end = 17
    #     if start > end:
    #         print('找不到这个值')
    #     mid = (end-start) // 2  + start  #mid = 17
    #     if l[mid] > aim:
    #         find_2(l,aim,start,mid-1)    #find_2(l,58,17,16)
    #     elif l[mid] < aim:
    #         find_2(l,aim,mid+1,end)
    #     else:
    #         print(aim,mid)
    
    def find_2(l,aim,start=0,end=None):  #[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]
        if end == None:end = len(l) - 1  #start = 0,end = 24
        if start <= end:
            mid = (end-start) // 2  + start  #mid = 12
            if l[mid] > aim:
                ret = find_2(l,aim,start,mid-1)
                return ret
            elif l[mid] < aim:              #
                ret = find_2(l,aim,mid+1,end)     #find_2(l,58,13,24)
                return ret
            else:
                return aim,mid
        else:
            print('找不到这个值')
    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(find_2(l,87))
    
    #参数传递
    #返回值的问题
    #找不到值的问题
    #参数太多的问题
    View Code

    阶乘算法,斐波那契数列算法:

    #阶乘的计算
    #什么叫阶乘: 7  #7*6*5*4*3*2*1
    
    def f(n):
        if n == 1:
            return 1
        else:
            return n*f(n-1)
    
    # f(3)
    
    #斐波那契数列
    # 1,1,2,3,5,8,13....
    # n = 10
    # f(10) = f(8)+f(9)
    def fib(n):
        if n == 1 or n == 2:
            return 1
        return fib(n-1)+fib(n-2)
    
    print(fib(6))
    
    ####本来会斐波那契了,这样把递归函数套进来,然后就不会了。。。。好难理解啊,怎么这么绕啊
    View Code

     我居然自己搞明白了!我简直太牛逼了!

    这是我自己推导的斐波那契数列的思路

    # 斐波那契数列:
    def fib(n):
        if n == 1 or n == 2:
            return 1
        return fib(n-1) + fib(n-2)
    fib(n)
    #n=8
    def fib(8):#所以fib(8)就是21
        if n == 1 or n == 2:
            return 1
        return fib(8-1) + fib(8-2)#这里fib(7)+fib(6)最终return的结果是21
    #请注意要从下往上看!!!!
    # 此时需要把return fib(8-1)和fib(8-2)的函数分别求出return的值,然后相加就可以得到fib(8)的值
    # 那么fib(8-1)就是fib(7),同理,fib(8-2)就是fib(6)
    # 现在我们来分别求出fib(7)的值和fib(6)的值。其实很简单的,就是过程很麻烦重复很多遍,要不断的向下去求值。
    # 要求fib(6)的值就把它放进上面的函数公式里即可一层层剥皮得到最下层的结果,再一层层加上来,就实现了递归。
    # 开始执行:
    def fib(7):#所以fib(7)就是13
        if n == 1 or n == 2:
            return 1
        return fib(7-1)+fib(7-2)#这里fib(6)+fib(5)最终return的结果是13
    def fib(6):#所以fib(6)就是8
        if n == 1 or n == 2:
            return 1
        return fib(6-1)+fib(6-2)#这里fib(5)+fib(4)最终return的结果是8
    def fib(5):#所以fib(5)就是5
        if n == 1 or n == 2:
            return 1
        return fib(5-1)+fib(5-2)#这里fib(4)+fib(3)最终return的结果是5
    def fib(4):#所以fib(4)就是3
        if n == 1 or n == 2:
            return 1
        return fib(4-1)+fib(4-2)#这里fib(3)+fib(2)最终return的结果是3
    def fib(3):#所以fib(3)就是2
        if n == 1 or n == 2:
            return 1
        return fib(3-1)+fib(3-2)   #这里fib(2)+fib(1)最终return的结果是2
    def fib(2):
        if n == 1 or n == 2:
            return 1   #我们一层一层剥下来,这里就是最底层,现在开始向上一层一层相加
    View Code

     另一种实现方式

    def fib():
        a = 1
        b = 2
        while True:
            c = a + b
            yield c
            a = c + b
            yield a
            b = a + c
            yield b
    
    
    obj = fib()
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))

    三级菜单的递归函数:

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    
    def menu_3(menu):
        while True:
            for key in menu:
                print(key)      #北京上海山东
            choice = input('选择 : ')   #北京
            if choice == 'q' or choice == 'b':
                return choice
            elif choice in menu and menu[choice]:        #北京 in menu
                borq =  menu_3(menu[choice])
                if borq == 'q':
                    return 'q'
    
    menu_3(menu)
    View Code

     

  • 相关阅读:
    BestCoder Round #71 (div.2) (hdu 5621)
    BestCoder Round #71 (div.2) (hdu 5620 菲波那切数列变形)
    BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)
    BestCoder Round #70 Jam's math problem(hdu 5615)
    BestCoder Round #68 (div.2) tree(hdu 5606)
    poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)
    hdu 3874 Necklace(bit树+事先对查询区间右端点排序)
    HDU 4300 Clairewd’s message(KMP)
    HDU 3308 LCIS(线段树单点更新区间合并)
    PKU 3667 Hotel(线段树)
  • 原文地址:https://www.cnblogs.com/2012-dream/p/7808258.html
Copyright © 2011-2022 走看看