您的位置:首页 > 编程语言 > Python开发

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和负数)

优化方案都类似,就不再赘述了

以上为本文全部内容,欢迎指正和交流~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: