斐波那契问题:
'''
思路1:递归
⭐ 以 f(0)和f(1)为终止条件
⭐ 返回 fib(n-1) + fib(n-2)
递归算法的复杂度:递归的次数 * 每次递归中的操作次数
复杂度: 时间复杂度O(n) 空间复杂度O(1)
缺点:大量重复的递归计算
'''
def fib(n):
# 终止条件
if n == 0:
return 0
if n == 1:
return 1
# 递归
return (fib(n-1) + fib(n-2)) % 1000000007
'''
思路2:动态规划
⭐ dp[i]代表第i个斐波那契值
⭐ 转移方程: dp[i] = dp[i-1] + dp [i-2]
复杂度: 时间复杂度O(n) 空间复杂度O(1)
'''
def fib2(n):
a, b = 0, 1 # 降低空间复杂度
for i in range(n):
a, b = b, a + b
return a % 1000000007
print(fib2(1))
青蛙跳台阶问题
'''
思路:从后向前思考 即考虑跳最后一个台阶 有以下两种情况:
1:当最后一个台阶是1时 此时还剩 n-1个台阶 则有 f(n-1)种跳法
2:当最后一个台阶是2时 此时还剩 n-2个台阶 则有 f(n-2)种跳法
故 第n个台阶的跳法是 f(n-1)+f(n-2) 由该通解可知与求解斐波那契数列的解法一致
初始值:当n=0时 既不跳上1级台阶 也不跳上2级台阶 f(0) = 1
当n=1时 只能跳上1级台阶 f(1) = 1
当n=2时 可以直接跳上2级台阶 也可以跳两次一级台阶 f(2) = f(0)+f(1)
'''
def numWays(n):
a, b = 1, 1
for i in range(n):
a, b = b, a + b
return a % 1000000007
print(numWays(7))