斐波那契数列
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
Python实现:
解一:
利用列表
def Fibonacci1(n):
l = [0, 1]
if n>1: for i in range(n-1): l.append(l[i-1] + l[i-2]) return l[n]
解二:
从第二个开始 前两个相加再分别交换
def Fibonacci2(n): a = 0 b = 1 if n == 0: return a if n == 1: return b
for i in range(2,n+1): c = a + b a = b b = c return b
解三:
需要理解下,本质和第二种方法一样
def Fibonacci3(n): if n == 0: return 0 a = 0 # 第一个 b = 1 # 第二个
for i in range(n): a, b = b, a+b return a
解四:
迭代函数,时间开销比较大,华而不实
def Fibonacci4(n): if n == 0: return 0 if n==1 or n==2: return 1 return Fibonacci4(n-1) + Fibonacci4(n-2)
斐波拉契数列生成器:
def fib(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b yield a def main(): for val in fib(20): print(val) if __name__ == '__main__': main()
类似问题:
1. 跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
# -*- coding:utf-8 -*- class Solution: def jumpFloor(self, number): # write code here if number==1: return 1 if number == 2: return 2 a = 1 b = 2 for i in range(2, number + 1): c = a + b a = b b = c return b
分析:
a.如果第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1)
b.如果第一次跳的是二阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列:
n = 1: f(n) = 1
n = 2: f(n) = 2
n > 2: f(n-1)+f(n-2)
2. 矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
# -*- coding:utf-8 -*- class Solution: def rectCover(self, number): # write code here if number == 0: return 0 a = 1 b = 1 for i in range(number): a, b = b, a+b return a
分析:
2*n的大矩形,和n个2*1的小矩形
其中n*2为大矩阵的大小
有以下几种情形:
① n <= 0 大矩形为<= 2*0,直接return 1;
② n = 1 大矩形为2*1,只有一种摆放方法,return 1;
③ n = 2 大矩形为2*2,有两种摆放方法,return 2;
④ n >= 3 分为两步考虑:
第一步:第一次摆放一块 2*1 的小矩阵,则摆放方法总共为f(n - 1)
第二步:第一次摆放一块1*2的小矩阵,则摆放方法总共为f(n - 2)
√ | |||||||
√ |
第二步:第一次摆放一块1*2的小矩阵,则摆放方法总共为f(n - 2)
因为,摆放了一块1*2的小矩阵(用√√表示),对应下方的1*2(用××表示)摆放方法就确定了,所以为f(n - 2)
√ | √ | ||||||
× | × |