题目:
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)
结论:速度很快。
做题小结:不断发现问题解决问题,在从中寻找到更合适的办法,但是现在还是个小白,多数都是从网上学习再使用,算法思维不够灵活。文末感谢陆老师的指点。