剑指offer09:斐波那契数列

来源:互联网 发布:什么变声软件好用 编辑:程序博客网 时间:2024/05/22 03:47

递归和循环

递归实现方法代码简洁,但性能不如循环。
优先采用递归 !

递归的缺点

缺点1:递归由于是函数调用自身,而函数调用是有时间和空间的消耗的
每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而且往栈压入数据和弹出数据都需要时间。

缺点2:递归中有可能很多计算是重复的。
递归的本质是把一个问题分解成两个或者多个小问题。如果小问题存在相互重叠的部分,就存在重复计算。

缺点3:递归可能引发栈溢出。
因为需要每次函数调用在内存栈中分配空间,而每个进程的栈的容量是有限的。当递归调用层数太多时,就会超出栈的容量,导致栈溢出。

递归解法

题目一: 写一个函数,输入n,求斐波那契数列的第n项

递归解法的时间复杂度为n的指数级

    public static int fibonacci(int n){        if(n < 2){            return n;        }        return fibonacci(n-1) + fibonacci(n-2);    }

循环解法

时间复杂度为n

public class Solution {    public int Fibonacci(int n) {        int[] result = {0, 1};        if(n < 2)            return result[n];        int fbMinusOne = 1;        int fbMinusTwo = 0;        int fbN = 0;        for(int i = 2; i <= n; ++i){            fbN = fbMinusOne + fbMinusTwo;            fbMinusTwo = fbMinusOne;            fbMinusOne = fbN;        }        return fbN;    }}

拓展1- 青蛙跳楼梯

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法。

假如青蛙在第n级楼梯处, 则有0种跳法; 如果在第n-1级有一种跳法,就是一次跳一级; 如果在第n-2级, 则有两种方式, 每次跳一级,分两次跳到第n级, 亦或可以一次跳两级到达第n级。

public class Solution {    public int JumpFloor(int target) {        int[] result = {0, 1, 2};        if(target <= 2)            return result[target];        int minusOne = 2;        int minusTwo = 1;        int jf = 0;        for(int i = 3; i <= target; ++i){            jf = minusOne + minusTwo;            minusTwo = minusOne;            minusOne = jf;        }        return jf;    }}

拓展2- 青蛙跳楼梯

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

指数阶乘, 2^(n-1) 种跳法

public class Solution {    public int JumpFloorII(int target) {        if(target <= 0)            return 0;        return 1 << (target - 1);    }}

拓展3- 覆盖矩形

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

public class Solution {    public int RectCover(int target) {        if(target <= 0)            return 0;        int[] result = {1, 2};        if(target <= 2)            return result[target - 1];        int one = 2;        int two = 1;        int total = 0;        for(int i = 3; i <= target; i++){            total = one + two;            two = one;            one = total;        }        return total;    }}

参考文献

http://blog.csdn.net/lizhongping00/article/details/67631929

0 0