python之斐波那契青蛙跳台阶、矩阵覆盖问题及其优化
2018-03-14 23:41
337 查看
python之斐波那契青蛙跳台阶、矩阵覆盖问题优化
题目描述:(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
问题一,简单分析可以得到一个斐波那契问题,解决方案有迭代和递归,还有在python中还可以用匿名函数,几种实现如下:
def fib(n): """ 迭代斐波那契 """ if type(n) != int or n <= 0: return a, b = 0, 1 for _ in range(n): a, b = b, a+b return b def fib_1(n): """ 递归斐波那契 """ if type(n) != int or n <= 0: return if n <= 2: return n return fib_1(n-1) + fib_1(n-2) # 匿名斐波那契 fib_2 = lambda n:n if n <=2 else fib_2(n-1)+fib_2(n-2)
递归用的是将中间结果压栈的方式,所以性能相对较差,建议用迭代
类似问题(矩形覆盖):我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?(第一块放在边上,可以横着放或者竖着放,对应的方法为f(n-1)+f(n-2),所以仍为斐波那契数列问题)
问题二分析:
设跳n级有f(n)种方法,
则第一步可以选择跳1.2.3…n级,
则接下来有f(n-1).f(n-2).f(n-3)…f(1),
由此可见f(n)=f(1)+…+f(n-1)+1=2^(n-1),
即求2的n-1次方。
问题到此就得以解决了~
但是!光是这样解决问题,并不是最好的解决方法。
当n很大的时候,如何解决?对于乘法如何优化?
这里给出两个优化思路:
1. 分治思想
2. 利用位计算代替乘除运算,以提高效率
因此,优化后的解决方案如下:
def power_2(n): if type(n) != int or n <= 0: return if n == 1: return 2 result = power_2_2(n>>1) result *= result if 1 == n&1: # 判断奇偶 result = result<<1 return result
此问题可以扩展为求任何数(整数、小数、0)的整数次方(包括0和负数)
优化方案都类似,就不再赘述了
以上为本文全部内容,欢迎指正和交流~
相关文章推荐
- 斐波那契数列及其变形问题(跳台阶,变态跳台阶,矩形覆盖)
- 递归的logN的优化(菲波那契数列,青蛙上台阶问题,母牛问题)!!!!
- HihoCoder1143 骨牌覆盖问题·一(矩阵快速幂,斐波那契)
- 台阶问题及其变形(后期优化暂不写)
- 青蛙爬台阶问题的三种解法@python
- Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
- 斐波那契数列求青蛙跳台阶问题
- (2)斐波那契数列及其应用跳台阶问题
- 斐波那契数列的优化问题 青蛙跳台阶问题
- 斐波那契数列及青蛙跳台阶问题
- 青蛙跳台阶问题暨斐波那契数列
- 斐波那契和青蛙跳台阶问题(Java)
- 斐波那契额数列及青蛙跳台阶问题
- 剑指offer面试题9-青蛙跳台阶及其变种问题
- CentOS7上安装Python3.X及其与旧版本Python2.7.5的共存问题
- 约瑟夫环问题及其尽可能的优化
- spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
- 面试题:青蛙跳台阶问题
- android问题及其解决-优化listView卡顿和如何禁用ListView的fling
- [牛客网,剑指offer,python] 矩阵覆盖