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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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









以上是关于python开发函数进阶:递归函数的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Python 函数进阶-递归函数

python 函数的进阶

python大法好——递归内置函数函数进阶

进阶学Python:Python的递归函数和装饰器

六. python进阶(递归)