LeetCode 的 Python 实现 70: 爬楼梯问题

本文探讨了经典的爬楼梯问题,通过解析其背后的数学原理——斐波那契数列,提供了两种解决方案:递归实现和非递归实现。递归方式直观但效率低下,易导致超时或栈溢出;非递归方式则通过迭代计算,避免了上述问题,实现了高效求解。

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

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

爬楼梯问题的实质就是 斐波那契数列
f(n) = f(n-1) + f(n-2)

递归实现

最先想到的就是简单粗暴的递归方式实现.

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if(n == 1 or n == 0):
            return 1
        else:
            # 假如不是以类的形式, 直接 return 函数() 不需要加 self.
            return self.climbStairs(n-1) + self.climbStairs(n-2)

显然这种方式是无法通过 LeeCode 测试的, 绝对超时. 就算不超时换个大一点的数也会栈溢出.

关于 Python 的尾递归方式实现可以参考廖雪峰老师的文章 - 递归函数

非递归实现

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if(n == 1 or n == 0):
            return 1
        
        temp = [1, 1]
        result = 0
        
        while(n > 1):
            result = temp[-1] + temp[-2]
            temp[-1] = temp[-2]
            temp[-2] = result
            n = n - 1
        
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值