一.递归
定义:在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
递归问题
递推问题作为动态规划的基础,是最好掌握的,也是必须掌握的,它有点类似于高中数学中的数列,通过 前几项的值 推导出 当前项的值。
比较经典的类型就是 斐波那契数列 an=an-1 +an-2
a=0
b=1
while b < 1000:
print(b)
a, b = b, a+b
二维递归
比较经典的有杨辉三角
在二维列表中 行代表第一维 列代表第二维
下面是用代码实现的杨辉三角
#先定义阶层函数,求出阶层
def fact(n):
if n == 0:
return int(1)
else:
return int(n*fact(n-1))
#再定义组合函数,求出组合C(n,m)的值
def com(n,m):
return fact(n)/(fact(m)*fact(n-m))
#调用cum函数,输出结果
i = int(input("请输入阶层:"))
n=0
while n <=i :
for m in range(n+1):
result = str(int(com(n,m))) #注意,cum的计算结果是float型,需要转换成str才能插入列表,转换之前先用int化成整型,去掉小数点
print(result,end = "\t")
print("")
n += 1
#运行结果:
请输入阶层:8
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
二.线性dp
最小花费
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
dp=[0 for _ in range(len(cost))]
dp[0],dp[1]=cost[0],cost[1]
for x in range(2,len(cost)):
dp[x]=min(dp[x-2]+cost[x],dp[x-1]+cost[x])
return min(dp[-1],dp[-2])