• python开发函数进阶:递归函数


    一,什么叫递归

    #递归
    #在一个函数里调用自己
    #python递归最大层数限制 997
    #最大层数限制是python默认的,可以做修改
    #但是我们不建议你修改

    例子和尚讲故事

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #:基础版本
     5 def story():
     6     print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
     7 while True:
     8     story()
     9 
    10 #:递归版本
    11 def story():
    12     #递归函数,在一个函数内调用自己
    13     #最大递归层数做了一个限制:997
    14     print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
    15     story()
    16     print('123')
    17 story()

     修改深度

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 import sys #所有和python相关的设置和方法
     5 sys.setrecursionlimit(10000000)
     6 n = 0
     7 def f():
     8     global n
     9     n += 1
    10     print(n)
    11     f()
    12 f()

    二,递归实例

    递归实现三级菜单

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #三级菜单,按B返回
     5 menu = {
     6     '北京': {
     7         '海淀': {
     8             '五道口': {
     9                 'soho': {},
    10                 '网易': {},
    11                 'google': {}
    12             },
    13             '中关村': {
    14                 '爱奇艺': {},
    15                 '汽车之家': {},
    16                 'youku': {},
    17             },
    18             '上地': {
    19                 '百度': {},
    20             },
    21         },
    22         '昌平': {
    23             '沙河': {
    24                 '老男孩': {},
    25                 '北航': {},
    26             },
    27             '天通苑': {},
    28             '回龙观': {},
    29         },
    30         '朝阳': {},
    31         '东城': {},
    32     },
    33     '上海': {
    34         '闵行': {
    35             "人民广场": {
    36                 '炸鸡店': {}
    37             }
    38         },
    39         '闸北': {
    40             '火车战': {
    41                 '携程': {}
    42             }
    43         },
    44         '浦东': {},
    45     },
    46     '山东': {},
    47 }
    48 print('主菜单'.center(40,'='))
    49 # while True:
    50 #     for i in menu:print(i)
    51 #     user1 = input('no 1>>>:')
    52 #     if user1 == 'b':break
    53 #     if user1 == 'q':exit()
    54 #     if user1 not in menu:continue
    55 #     if user1 in menu:
    56 #         while True:
    57 #             for i1 in menu[user1]: print(i1)
    58 #             user2 = input('no 2>>>:')
    59 #             if user2 == 'b': break
    60 #             if user2 == 'q': exit()
    61 #             if user2 not in menu[user1]: continue
    62 #             if user2 in menu[user1]:
    63 #                 while True:
    64 #                     for i2 in menu[user1][user2]: print(i2)
    65 #                     user3 = input('no 3>>>:')
    66 #                     if user3 == 'b': break
    67 #                     if user3 == 'q': exit()
    68 #                     if user3 not in menu[user1][user2]: continue
    69 #                     if user3 in menu[user1][user2]:
    70 #                         while True:
    71 #                             user4 = input('no 4>>>:')
    72 #                             if user4 == 'b':break
    73 #                             if user4 == 'q':exit()
    74 
    75 def list(menu):    #menu being
    76     while True:
    77         for i in menu:
    78             print(i)
    79         k = input('>>>').strip()##beijng
    80         if k == 'b' or k =='q':    #k
    81             return k #diyi beijing
    82         if k in menu:
    83             ret = list(menu[k])  #menu shahe
    84             if ret == 'q':return 'q'
    85 index = list(menu)
    86 print(index)
    View Code

    递归实现二分查找

     1 #!/usr/bin/env python
     2 #_*_coding:utf-8_*_
     3 
     4 #二分查找算法
     5 #算法:计算的方法
     6 #有序的递增列表
     7 #查找的是数字
     8 l = [2,3,5,10,15,16,18,22,26]
     9 def find(l,aim): #l:列表 aim:要找的
    10     mid = len(l)//2  #计算中点
    11     if l[mid] > aim: #判断中间位置的值和目标值的大小关系
    12         new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
    13         return find(new_l,aim)
    14     elif l[mid] < aim:#判断中间位置的值和目标值的大小关系
    15         new_l = l[mid+1:]
    16         return find(new_l,aim)
    17     else:
    18         return l[mid]
    19 print(find(l,16))
    20 
    21 #升级版二分法
    22 #查找的是索引
    23 l = [2,3,5,10,15,16,18,22,26]
    24 def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26]  0,8
    25     mid = (end+start)//2  #4   #5+8/2=6  #start =5 end = 5 mid = 5
    26     if start <  end:
    27         if l[mid] > aim:  #15  17  #18 17
    28             end = mid -1  #end =6-1 = 5
    29             return find2(l,aim,start,end)
    30         elif l[mid] < aim: #15  17
    31             start = mid + 1  # start = 5
    32             return find2(l, aim, start, end)
    33         else:
    34             return mid
    35     else:
    36         return "找不到"
    37 print(find2(l,18,start=0,end = len(l)-1))
    38 
    39 #高级版二分法
    40 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]
    41 def func(l, aim,start = 0,end = len(l)-1 ):
    42     mid = (start+end)//2
    43     print(l[start:end+1])
    44     if not l[start:end+1]:      #空就是False not 就是 true
    45         return
    46     elif aim > l[mid]:
    47         return func(l,aim,mid+1,end)
    48     elif aim < l[mid]:
    49         return func(l,aim,start,mid-1)
    50     elif aim == l[mid]:
    51         print("bingo")
    52         return mid
    53 index = func(l,1)
    View Code

    三,总结

    #递归解决的问题
    #就是通过参数,来控制每一次调用缩小计算的规模
    #适合的场景
    #数据的规模在减小,但是解决问题的思路没有改变
    #结束递归的标志:return

  • 相关阅读:
    算法导论第十三章:红黑树
    算法导论:相关数学问题小结
    STL_源码剖析之三:迭代器与traits
    算法导论第十二章:二叉查找树
    Common Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈(摘一段)
    STL源码剖析之六:算法
    STL 源码剖析之四:序列式容器
    算法导论第十四章:数据结构的扩张
    链表的归并排序:来自STL_ list_ sort 算法
    STL源码剖析之五:关联式容器
  • 原文地址:https://www.cnblogs.com/jokerbj/p/7270768.html
Copyright © 2020-2023  润新知