递推,递归及其优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 + "微秒");
    }
}

运行结果:

图片1.png

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);

    }
}

运行结果

图片3.png

通过对递归优化,时间由440249微秒变为206微妙

猜你喜欢

转载自blog.csdn.net/lwhlwh2012/article/details/73351097