跳至主要內容

01-爬楼梯问题「递归/Python」

神不烦原创大约 2 分钟...约 695 字

假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例1

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 步 + 1 步
  2. 2 步

示例2

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 步 + 1 步 + 1 步
  2. 1 步 + 2 步
  3. 2 步 + 1 步

我第一反应是用递归实现,然而不出所料超出时间限制。

        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            s1 = self.climbStairs(n-1)
            s2 = self.climbStairs(n-2)
            return s1+s2 

所以。。。。再想一想。既然递归不行就递推试试。emmm…网上说这个问题的结果和 Fibonacci 数列一样。果然是这样。。。尽管可以转换为求解 fibonacci,但是还是应该好好思考一下怎么解决原问题。毕竟可能会联想不到 fibonacci。

        nums = [0,1,2]
        if n == 1:
            return nums[1]
        elif n == 2:
            return nums[2]
        else:
            for i in range(3,n+1):
                nums.append(nums[i-1] + nums[i-2])
        return nums[n]

上面这个版本通过了,但是只战胜了25%的人,寻求更优的算法吧。

这个很机智啊,我的列表初始化可以优化成如下:

        condition = [0] * (n + 1)
        condition[0] = 1
        condition[1] = 1
        for i in range(2, n+1):
            condition[i] = condition[i-1] + condition[i-2]
        return condition[n]

关于循环和递归:
Loops may achieve a performance gain for your program. Recursion may achieve a performance gain for your programmer. Choose which is more important in your situation!

如果使用循环,程序的性能会更高。如果使用递归,程序更容易理解。

原文:https://blog.csdn.net/qq_34364995/article/details/80284361open in new window

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度