《剑指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