斐波那契数列

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的小矩阵(用√√表示),对应下方的1*2(用××表示)摆放方法就确定了,所以为f(n - 2)






× ×




 
posted @ 2019-05-15 15:41  xyfun72  阅读(127)  评论(0编辑  收藏  举报