剑指offer:Python 跳台阶问题

本文详细解析了经典的跳台阶问题,包括基本跳法和变态跳法的算法思路及Python实现。基本跳法遵循斐波那契数列,变态跳法则呈现指数增长特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跳台阶问题

'''
一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
'''
思路过程
'''
首先通过简单地计算n=1,n=2,n=3,n=4 ,可以得出有多少种结果;
可以找出规律和斐波那契数列形式,后一项的可能性等于前两项可能性的和;
青蛙从开头开始跳和从结尾开始跳,效果是一样的!假设青蛙从n出开始跳:
那它有两种可能,一是开始跳1格,那么久还剩下f(n-1)种可能,如果是跳
2格,那么久还剩f(n-2)种可能,两种跳法是独立的,所以相加,即是:
f(n)=f(n-1)+f(n-2)
'''

在这里插入图片描述

Python实现
# 第一种实现方法

def jump_floor(n):
    if n <1:
        return 0

    if n == 1:
        return 1

    if n == 2:
        return 2
    if n > 2:
        ret = 0
        a = 2
        b = 1
        for i in range(3, n + 1):
            ret = a + b
            b = a
            a = ret
        return ret


print(jump_floor(4))
# 第二种实现方法

class Solution:
    def jump_floor(self, number):
        if number == 0 or number == 1 or number == 2:
            return number
        result = [1, 2]
        for i in range(3, number+1):
            result.append(result[i - 2] + result[i - 3])
        return result[-1]


obj = Solution()
print(obj.jump_floor(4))

变态跳台阶问题

'''
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。
求该青蛙跳上一个n级的台阶总共有多少种跳法
'''
思路过程
'''
因为新加了可以调到任意位置,所以总可能性变为了,当前项前面每一项的可能相加;
即是 f(n)=f(n-1)+f(n-2)+...f(1)   f(n-1)=f(n-2)+...f(1) 两种可能相互独立,相加可得:
f(n)=2f(n-1)
'''

在这里插入图片描述

Python实现
def jump_floor(number):
    if number < 1:
        return 0
    if number == 1:
        return 1
    if number == 2:
        return 2
    if number > 2:
        ret = 1 # 注意变成了相乘,ret不能取0
        a = 2
        for i in range(3, number + 1):
            ret = 2 * a
            a = ret
        return ret


print(jump_floor(5))
'''
上面其实隐含一个条件:f(0)=1 为什么?因为f(1)=2f(0),f(1)=1,所以f(0=1)
只是我们这次只会用到较大的一项,所以缩小范围照样可以!
'''
def jump_floor(number):
    if number < 1:
        return 0
    if number == 0:
        return 1
    if number == 1:
        return 1
    ret = 1
    a = 1
    for i in range(2, number + 1):
        ret = 2 * a
        a = ret
    return ret


print(jump_floor(5))
# 或者写成
class Solution:
    def jump_floor(self, number):
        if number == 0:
            return 1
        if number == 1:
            return 1
        return 2 * self.jump_floor(number-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值