版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwhlwh2012/article/details/73351097
题目:
斐波那契数列定义为:
f1=f2=1, fn=fn-1+fn-2
求斐波那契数列的第n项
1.递推求解
递推公式的下标实际上就是数组元素的下标,设置一维数组f(n),数列的递推关系为:
f(k)=f(k-1)+f(k-2)
初始条件为:
f(1)=1,f(2)=2
程序实现:
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args) {
System.out.println("请输入项数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long startTime = System.nanoTime();
int[] f=new int[n+1];
f[1]=1;
f[2]=1;
for (int k=3;k<=n;k++){
f[k]=f[k-1]+f[k-2];
}
System.out.println("第"+n+"项为:"+f[n]);
long endTime = System.nanoTime();
System.out.println("程序运行时间: " + (endTime - startTime)/1000 + "微秒");
}
}
运行结果:
2.递归求解
递归关系为f(n)=f(n-1)+f(n-2)
边界条件为n=1或n=2是,f(n)=1
程序实现
import java.util.Scanner;
public class Fibonacci4 {
public static void main(String[] args) {
System.out.println("请输入项数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long startTime = System.nanoTime();
System.out.println(f(n));
long endTime = System.nanoTime();
System.out.println("程序运行时间: " + (endTime - startTime)/1000 + "微秒");
}
static int f(int n){
if (n==1 || n==2){
return 1;
}
else {
return f(n-1)+f(n-2);
}
}
}
````
运行结果:
![图片2.png](http://upload-images.jianshu.io/upload_images/252139-959d129bae66a4ef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
递推和递归比较,递归求解的代码虽然简洁,但是求解速度比较慢,特别n越大的时候.因为递归调用,需要开辟栈空间,而且需要回溯,在这个过程中,还有许多重复运算.
<div class="se-preview-section-delimiter"></div>
####3.递归求解优化
对于上面的递归存在的问题进行优化,如何避免重复运算,空间换时间,使用数组存放已经算过的解,当再次遇到这个问题的时候,直接从数组中找到解
程序实现
<div class="se-preview-section-delimiter"></div>
```java
import java.util.Scanner;
public class Fibonacci3 {
static int[] array;
public static void main(String[] args) {
System.out.println("请输入项数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
array=new int[n+1];
long startTime = System.nanoTime();
System.out.println(f(array,n));
long endTime = System.nanoTime();
System.out.println("程序运行时间: " + (endTime - startTime)/1000 + "微秒");
}
static int f(int[] a,int n){
if (n==1 || n==2){
a[1]=1;
a[2]=1;
return 1;
}
if (a[n]>0){ //如果a[n]算过,直接返回a[n]的值
return a[n];
}
a[n]=f(a,n-1)+f(a,n-2);//运算后,存放在数组中
return f(a,n-1)+f(a,n-2);
}
}
运行结果
通过对递归优化,时间由440249微秒变为206微妙