美文网首页
小青蛙跳台阶

小青蛙跳台阶

作者: 程序学习er | 来源:发表于2019-03-19 01:40 被阅读0次
    题目描述

    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    这题其实有点像fib数列,用递归写的

    递归写法

    def jumpFloor(number):
        if number <= 0:
            return 0
        if number in [1,2]:
            return number
        return jumpFloor(number - 2) + jumpFloor(number - 1)
    

    很可惜 虽然想了出来但是并没有通过。

    运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大


    好吧,用递归写的那一刻我就该意识到这一点

    尾递归写法

    def jumpFloor(number, curr = 2, last = 1):
        if number == 0:
            return 0
        if number == 1:
            return 1
        if number == 2:    #这里是if,如果是else也会出错
            return curr    #这里是返回curr,返回2会出错
        return jumpFloor(number - 1, curr + last, curr)
    

    尾递归我吃了好多坑,倒数第二行返回2我简直是脑抽,因为number最终肯定会变成2,那么不管怎么样输出的结果都是2;

    在这个代码里,最后的出口并不是最下面的

    return jumpFloor(number - 1, curr + last, curr)
    

    而是代码上面那个判断条件

        if number == 2:    #这里是if,如果是else也会出错
            return curr    #这里是返回curr,返回2会出错
    

    所return的是curr,而并不是靠上级领导等下属都忙完了再来添上一笔,这点和递归很不一样。

    关于第三个if可以为curr,那么第二个if是否可以也改成last呢,其实无影响,因为number根本就不可能到为1的时候。

    关于倒数第3行为什么不能改else,这里有个例子

    def f(n):
        if n == 0:
            print(0)
        if n == 1:
            print(1)
        else:
            print(2)
    
    if __name__ == '__main__':
        f(0)
    

    输出结果为

    0
    2
    

    这里看下来,会一顺溜的打印下来,结果就不唯一了

    还有个情况

    def f(n):
        if n == 1:
            return 1
        else:
            return 2
        if n == 0:   #这句他妈逼甚至都不会被管
            return 0
    
    if __name__ == '__main__':
        print(f(0))
    

    在Pycharm里,写标示的下面都是亮黄灯,else下面的if语句甚至不会再执行。

    总结:有多个if的情况下就不要再用else

    虽然编译通过了 但是还是想试试其他写法

    动态规划

    pass
    

    学到我再补8

    相关文章

      网友评论

          本文标题:小青蛙跳台阶

          本文链接:https://www.haomeiwen.com/subject/qmqwmqtx.html