Java版牛客网剑指offer编程题第7题--斐波拉契数列
斐波那契数列
http://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。
- 不积硅步,无以至千里;
- 不积小流,无以成江海。
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39。
我的想法
- 斐波拉契数列,第n(n>=2)项等于前两项的和,即F(n)=F(n-1)+F(n-2),n>=2且为正整数。
- 斐波拉契数列很明显体现的是一个递归思想。
- 递归求解很简单,但是重复计算了很多次已知值,怎么优化?
解题方法1
/** * 递归求解 * */ public static int Fibonacci(int n) { if(n==0){ return 0; } if(n==1){ return 1; } /** * 重复计算次数太多,比如n=8,程序会去计算F(7)和F(6) * 为了计算F(7),程序又会再去计算F(6)和F(5),这样就重复计算了已知值 * 时间开销大,并且容易栈溢出。 * */ int result = Fibonacci(n-1) + Fibonacci(n-2); return result; }
解题方法2
/** * 优化:用一个数组将每个值存起来,需要的时候直接取,不用重复计算 * */ public static int Fibonacci2(int n) { ArrayList<Integer> list = new ArrayList<>(); list.add(0); list.add(1); if(n <= 1){ return list.get(n); }else{ for(int i = 2; i <= n; i++){ list.add(list.get(i-1)+list.get(i-2)); } return list.get(n); } }
代码测试
package com.learnjiawa.jzoffer; import java.util.ArrayList; /** * @author zouhuayu * 2019-12-06-9:38 */ public class Solution7 { public static void main(String[] args) { int n = 23; System.out.println("斐波拉契数列第"+n+"项是"+Fibonacci2(n)); } public static int Fibonacci(int n) { if(n==0){ return 0; } if(n==1){ return 1; } /** * 重复计算次数太多,比如n=8,程序会去计算F(7)和F(6) * 为了计算F(7),程序又会再去计算F(6)和F(5),这样就重复计算了已知值 * 时间开销大,并且容易栈溢出。 * */ int result = Fibonacci(n-1) + Fibonacci(n-2); return result; } /** * 优化:用一个数组将每个值存起来,需要的时候直接取,不用重复计算 * */ public static int Fibonacci2(int n) { ArrayList<Integer> list = new ArrayList<>(); list.add(0); list.add(1); if(n <= 1){ return list.get(n); }else{ for(int i = 2; i <= n; i++){ list.add(list.get(i-1)+list.get(i-2)); } return list.get(n); } } }
总结
题目主要考察递归和循环的相关知识点,先实现,再优化,迅速解题。
参考文献
[1]程杰. 大话数据结构. 北京:清华大学出版社, 2011.
更多
对我的文章感兴趣,持续更新中......
关注微信公众号:LearnJava