Offer 10-I Offer 10-II. 斐波那契数列系列题 (动态规划-简单)

Offer 10- I. 斐波那契数列

Offer 10- II. 青蛙跳台阶问题

斐波那契问题:

'''
    思路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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值