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)
08-15 22:02