递推算法在求斐波那契数列的优势

斐波那契数列是我们学习递归算法的常用实例,但实际上递归算法解决这类问题并没有优势,接下来我用递推算法来解决斐波那契数列,大家看一下它的优势之处。

递推算法

import java.util.Scanner;

/**
 * Fibonacci数列:1,1,2,3,5,8,13,21…
 * 求该数列第n个数的值。
 * 数列满足公式:F1=1,F2=1,Fn=Fn-1 + Fn-2
 */
public class Fibonacci {

    public static void main(String[] args) {

        System.out.print("请输入你想知道数列第几项的值:");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
            
        //递推算法查看Fibonacci数列第n项的值
        System.out.println("数列的第" + n + "项的值为:" + recursive(n));
        
    }
    
    /*
        递推算法查看Fibonacci数列第n项的值
    */
    private static int recursive(int n) {
        int r1 = 1, r2 = 1;
        int r = 0;

        if (n == 1 || n == 2) {
            return 1;
        }

        for (int i = 3; i <= n; i++) {
            r = r1 + r2;
            r1 = r2;
            r2 = r;
        }
        return r;
    }

}

 

递归算法

import java.util.Scanner;

public class Fibonacci {

    public static void main(String[] args) {

        System.out.print("请输入你想知道数列第几项的值:");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        
        //递归算法查看Fibonacci数列第n项的值
        System.out.println("数列的第" + n + "项的值为:" + recursiveDESC(n));

    }

    /*
        递归算法查看Fibonacci数列第n项的值
    */
    private static int recursiveDESC(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return recursiveDESC(n - 1) + recursiveDESC(n - 2);
        }
    }

}

 

 

对比实验
查看相同项所用时间对比
测试代码

public static void main(String[] args) {

        System.out.print("请输入你想知道数列第几项的值:");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        long t1=System.currentTimeMillis();
        //递推算法查看Fibonacci数列第n项的值
        recursive(n);
        long t2=System.currentTimeMillis();
        //递归算法查看Fibonacci数列第n项的值
        recursiveDESC(n);
        long t3=System.currentTimeMillis();

        System.out.println("递推算法用时:"+(t2-t1)+"毫秒");
        System.out.println("递归算法用时:"+(t3-t2)+"毫秒");

    }

 

实验结果
测试一些数据,选择了较为可靠的数据展示,结果很明显,0和1的差距

请输入你想知道数列第几项的值:40
递推算法用时:0毫秒
递归算法用时:300毫秒

  

总结
本来想这对比查看最大项实验的,结果递归算法一直在运行,一直递归调用方法,方法栈也不炸.思考了一下,其实递归调用主要受限于内存容量,这个实验也没啥意义.就只做了时间测试实验,大家感兴趣的可以体验一下这两个算法~
递归算法,每次都是对方法的操作,而且大量方法进栈,对栈内存的压力很大
递推算法,每次是对数进行操作,只保存了后两项的数值,无论是对内存还是CPU都没啥压力

posted @ 2019-09-22 16:37  醒时笑  阅读(229)  评论(0)    收藏  举报
Live2D