爬楼梯学习小日记(Python3.7)

题目:

 

1.递归思维

代码:

import time
def climb(n):
    if n<=2:
        return n
    if n>2:
        return climb(n-2)+climb(n-1)

if __name__ == '__main__':
    startime = time.time()
    # n = int(input("在键盘上输入楼梯数:"))
    print(climb(30))
    endtime = time.time()
    print(endtime - startime)

结论:速度很慢,算数上不到四十,太慢了。。。

解决办法:减少重复值的运算。

思想:使用备忘录memo思想,存储上一步的运算,直接调用,运算顺序为从上到下。

import time
startime = time.time()
def climb(n,memo):
    if n<=2:
        return n
    if (memo[n] != None):
        return memo[n]
    if n>2:
        memo[n] = climb(n-2,memo)+climb(n-1,memo)
        return memo[n]
    return 0

def climbmemo(n):
    memo = [None] * (n+1)
    return climb(n,memo)


if __name__ == '__main__':
    print(climbmemo(45))
    endtime = time.time()
    print(endtime-startime)

结论:速度快了很多,思考是否能换一种方法运算出来。

解决办法:从下到上,动态规划(不太会,有参考很多博主文章)。

思想:

1.确定状态 2.建立状态转移方程 3.初始条件和边界情况 4.计算顺序

代码:

import time
def climb(n):
    dp=[0]*n
    dp[0]=1
    dp[1]=2
    for i in range(2,n):
        dp[i] = dp[i-1]+dp[i-2]
    return dp[n-1]


if __name__ == '__main__':
    startime = time.time()
    # n = int(input("在键盘上输入楼梯数:"))
    print(climb(500))
    endtime = time.time()
    print(endtime - startime)

结论:速度很快。

做题小结:不断发现问题解决问题,在从中寻找到更合适的办法,但是现在还是个小白,多数都是从网上学习再使用,算法思维不够灵活。文末感谢陆老师的指点。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值