《剑指offer》斐波那契数列

  本题来自《剑指offer》 斐波那契数列 矩阵覆盖

题目一:

  大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39

思路:

  递归方式:return n<=0 ? 0 : n+fib(n-1)

  递归是由于函数调用自身,有时间和空间的消耗,每次自身的调用都需要在内存栈中分配空间以保存参数,返回地址和变量,而且栈中压入和弹出数据都需要时间,效率不高,如果数据过大,会导致栈内存溢出。但是代码简洁。

  循环方式:O(n)时间内的操作 

  循环是通过设置计算的初始值和终止条件在一个范围内重复运算。采用迭代的方式,从头计算后面的值。

C++ Code:

class Solution {
public:
    int Fibonacci(int n) {                    //采用循环的方式时间为O(n)
        int res[2] = {0,1};                   //初始的两个值【0,1】
        if (n < 2){                           //当n小于2直接返回
            return res[n];    
        }else{
            int fibOne = 0;
            int fibTwo = 1;
            int fib = 0;
            for (unsigned int i = 2;i<=n;i++){
                fib = fibOne + fibTwo;
                fibOne = fibTwo;
                fibTwo = fib;
            }
            return fib;
        }
    }
};

Python Code:

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):            #采用循环的方式计算
        # write code here
        res = [0,1]                    #n为0和1时候为【0,1】
        if n < 2:                    
            return res[n]              #如果n小于2直接返回
        else:                          #如果n大于2,采用叠加的方式计算
            fibOne = 0
            fibTwo = 1
            fib = 0
            for i in range(2,n+1):    
                fib = fibOne + fibTwo  #依次计算前面两个值,最终返回
                fibOne = fibTwo
                fibTwo = fib
            return fib

总结:

  本题延伸,比如跳台阶问题,或者汉诺塔问题,都是采用递归方式。

  如果需要重复性的多次计算相同的问题,通常可以采用递归或者循环两种方式。

题目二:

  我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:

  f(n) = f(n-1)+f(n-2)

Python Code:

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        res = [0,1]
        if number < 2:
            return res[number]
        one = 0
        two = 1
        for i in range(number+1):
            one,two = two,one+two
        return one

 

posted @ 2019-04-24 14:14  weilongyitian  阅读(251)  评论(0编辑  收藏  举报