递归
1.斐波那契数列
2.什么是递归
3.记忆化搜索
4.跳台阶问题
5.变态跳台阶问题
斐波那契数列
F
(
0
)
=
0
F(0) = 0
F(0)=0
F
(
1
)
=
1
F(1) = 1
F(1)=1
F
(
n
)
=
F
(
n
−
1
)
+
F
(
n
−
2
)
F(n) = F(n-1)+F(n-2)
F(n)=F(n−1)+F(n−2)
def f1(n):
if n == 0:
return 0
if n == 1:
return 1
return f(n-1)+f(n-2)
1.明确函数的定义
2.寻找递归终止条件
3.寻找能够将大问题分解成小问题的递归子式
记忆化搜索
我们已经知道各个的递归计算方式的问题是重复计算,那么我们把已经计算过的内容存下来就好了,这种方法叫做记忆化搜索
memo = [-1]*(n+1)
def f2(n):
if n == 0:
return 0
if n == 1:
return 1
if memo[n] == -1:
memo[n] = f2(n-1)+f2(n-2)
例题 LeetCode青蛙跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
class Solution:
def numWays(self,n):
memo = [-1]*(n+1)
def dp(n):
if n == 1 or n == 0:
return 1
if memo[n] == -1:
memo[n] = (dp(n-1)+dp(n-2)) % 1000000007
return memo[n]
return dp(n)
剑指offer 变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
class Solution:
def jumpFloorII(self,number):
memo = [-1] * (number+1)
def dp(n):
if n == 0 or n == 1: # 递归终止条件
return 1
if memo[n] == -1:
tmp = 0 # 青蛙可以跳多少次
for i in range(1,n+1): # 青蛙跳的能力是从1阶到n+1阶
tmp += dp(n-i) # 青蛙所在位置n-i的位置
memo[n] = tmp
return memo[n]
return dp(number)