剑指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); } }
相关文章推荐
- 剑指Offer面试题9(java版):斐波那契数列
- 剑指Offer(java版)斐波那契数列 ——1,1,2,3,5,8......
- 剑指Offer 面试题34:二叉树中和为某一值的路径 Java代码实现
- 剑指Offer 面试题42 左旋转字符串java实现
- (剑指Offer)面试题9:斐波那契数列
- 剑指Offer——面试题3:二维数组中的查找(Java)
- 剑指Offer 面试题15:二进制中1的个数 Java代码实现
- 剑指Offer(第二版)面试题10:斐波那契数列
- 剑指offer--面试题5:从尾到头打印链表--Java实现
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- Java中斐波那契数列相关面试题
- 剑指Offer面试题33(java版):把数组排成最小的数
- 剑指offer面试题 斐波那契数列
- 《剑指offer》 面试题53 :正则表达式匹配 Java
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
- 剑指Offer第六章面试题(Java版)
- 剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现
- 《剑指Offer》学习笔记--面试题9:斐波那契数列
- 剑指Offer面试题25(Java版):二叉树中和为某一值的路径
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点