跟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.
更多
对我的文章感兴趣,持续更新中…
关注微信公众号: