1. 递归
-
功能解耦
-
函数的作用:提高代码可读性,避免重复的代码,提高代码的复用性
-
在函数中尽量使用return,少使用print
2. 递归函数
-
递归函数的定义:在一个函数中调用自己
-
默认的递归最大限度是:997或998(小于1000)
-
修改默认最大限度:sys.setrecursionlimit,需要导入sys模块。尽量不要修改默认的最大限度
-
往往递归和循环是在一起使用
-
递归函数在算法中应用居多
-
算法:一种计算的方法
-
典型的排序:冒泡排序、快速排序、堆排序
-
查找算法:二分查找算法
-
人理解循环、神理解递归
# import sys
# sys.setrecursionlimit(10000)
3. 递归函数的应用
# x比y大2、y比z大2、z比i大2,i等于20,计算x的值
def func(n):
if n == 4:
return 20
return func(n+1) + 2
print(func(1))
>>>
26
# 求8的阶乘算法
def func(n):
if n == 1:
return 1
else:
return n * func(n-1)
print(func(8))
>>>
40320
# 输出第20位斐波那契算法的数字
def func(n):
if n == 1 or n == 2:
return 1
else:
return func(n-1) + func(n-2)
print(func(20))
>>>
6765
# 三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
def func(menu):
while True:
for i in menu:
print(i)
choose = input('请选择>>>:').strip()
if choose == 'q' or choose == 'b':
return choose
if choose in menu:
borq = func(menu[choose])
if borq == 'q':
return 'q'
func(menu)
4. 二分查找算法
# 查找列表中66的位置
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 func(l, num, start = 0, end = None):
if end == None:
end = len(l) - 1
if start <= end:
mid = (end - start) // 2 + start
if l[mid] > num:
return func(l, num, start, mid-1)
elif l[mid] < num:
return func(l, num, mid+1, end)
else:
return ('%s的位置是: %s' %(num, mid))
else:
print('找不到这个值')
print(func(l, 66))
>>>
66的位置是: 17