b站视频:https://www.bilibili.com/video/BV1iS4y1e7MJ/?spm_id_from=333.999.0.0&vd_source=1717654b9cbbc6a773c2092070686a95
# 递归的定义:其实就是自己调用自己,一般用函数的形式来进行
"""
特点:
1、一定要有递推式(显示、隐式,也有过程)
2、一定要有递归的出口(为了避免一直执行,一定要中止程序)(一般要写在函数的开头)
3、一定要定义函数(函数自己调用自己)
4、比较耗内存(斐波那契数列重复计算f(3))
"""
"""
递归需要注意的地方:
1、会耗费大量的内存(重复计算),所以用递归一定要谨慎,如果电脑内存不够大,就不要用递归(例如计算斐波那契数列)
"""
# 举例
"""
1、递推式:
f(1)=1
f(2)=f(1)+1
f(3)=f(2)+1
f(4)=f(3)+1
.
.
.
f(n)=f(n-1)+1
2、出口
f(1)=1
"""
def f(n):
# 先写递归的出口
if n == 1:
return 1
else:
return f(n-1) + 1
a = f(5)
print(a)
# 斐波那契数列(会重复计算很多f(2)+f(1))
def f(n):
if n == 1:
return 0
elif n == 2:
return 1
else:
return f(n - 1) + f(n - 2)
print(f(6))
# 小明一次最多能上三层楼梯,爬到第n层能有多少种爬法
def f(n):
if n == 1:
return 1
elif n == 2:
return 2
elif n == 3:
return 4
else:
return f(n - 1) + f(n - 2) + f(n - 3)
print(f(5))
# 冒泡排序(使用递归)
def f(m1, m2):
global list1
# 递归出口
if m1 == m2:
return
# 递推式,没有公式,是一个过程
for i in range(m1, m2):
if list1[i] > list1[i + 1]:
list1[i], list1[i + 1] = list1[i + 1], list1[i]
# 递归
f(m1, m2 - 1)
list1 = [12, 11, 5, 6, 7, 18]
f(0, len(list1) - 1)
print(list1)
# 递归:求和,求最大值
def f(n):
if n == 1:
return 1
else:
return n + f(n - 1)
print(f(10))
list1 = [12, 14, 15, 8, 7]
def f(n):
if n == 1:
return list1[0]
else:
return max(f(n - 1), list1[n - 1])
print(f(len(list1)))
# 因式分解
num = 1
def f(m1, m2):
global num
# 循环结束就是出口,所以不写
for i in range(m1, m2):
if m2 % i == 0 and m2 // i >= i:
num += 1
f(i, m2 // i)
f(2, 36)
print(num)