您的位置:首页 > 职场人生

剑指offer-chapter2-面试题9-斐波那契数列(java)

2018-01-30 23:23 429 查看

题目描述

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

知识点:菲波那切数列、递归、循环

菲波那切数列:

|-     0              n=0
f(n)= |      1              n=1
|- f(n-1)+f(n-2)      n>2


递归:

优点: 简洁

缺点:

1.递归由于是函数调用自身,而函数的调用是有时间和空间的消耗的:

每一次函数调用,都需要在内存中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。

故递归不如循环效率高

2.多数计算重复,带来性能损失

3.调用栈溢出,层级过高的时候会超出栈的容量

思路:

常用递归解法1

public int Fibonacci(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n-1) + Fibonacci(n - 2);
}


缺点:

时间复杂度随n的提高指数增加。不是最优解法。

例如:

f(10)=f(9)+f(8)

f(9)=f(8)+f(7)

f(8)=f(7)+f(6)



这里面f(8)和f(7)需要重复递归计算,造成性能浪费

解法2 将已经计算过的保存备用

解法3 自下而上计算

从f3开始计算上去,不会造成额外开支,时间复杂度O(n)

解法4 将斐波那契数列转换成矩阵的乘方 时间复杂度O(logn) 有兴趣百度

代码:

package problem9;

/**
* Created by fengyuwusong on 2018/1/30 14:50.
* 题目描述
* 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
* n<=39
* 知识点:菲波那切数列、递归、循环
* 菲波那切数列:     |-     0              n=0
*          f(n)= |      1              n=1
*                  |- f(n-1)+f(n-2)     n>2
* <p>
* 递归:
* 优点: 简洁
* 缺点:  1.递归由于是函数调用自身,而函数的调用是有时间和空间的消耗的:
* 每一次函数调用,都需要在内存中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。
* 故递归不如循环效率高
* 2.多数计算重复,带来性能损失
* 3.调用栈溢出,层级过高的时候会超出栈的容量
*/
public class Main {
//    常用递归解法1 时间复杂度随n的提高指数增加
//    public int Fibonacci(int n) {
//        if (n == 0)
//            return 0;
//        if (n == 1)
//            return 1;
//        return Fibonacci(n-1) + Fibonacci(n - 2);
//    }
//    解法2 将已经计算过的保存备用
//    解法3 从下至上计算到n 时间复杂度O(n)
public int Fibonacci(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
int l = 0, ll = 1, now = 0;
for (int i = 2; i <= n; i++) {
now = l + ll;
l = ll;
ll = now;
}
return now;
}
//    解法4 将斐波那契数列转换成矩阵的乘方 时间复杂度O(logn)  有兴趣百度

public static void main(String[] args) {
Main main = new Main();
int res = main.Fibonacci(3);
System.out.println(res);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: