Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中产生斐波那契数的低效递归代码_Java_Recursion_Fibonacci - Fatal编程技术网

java中产生斐波那契数的低效递归代码

java中产生斐波那契数的低效递归代码,java,recursion,fibonacci,Java,Recursion,Fibonacci,以下递归方法旨在为给定整数(用Java编写)生成斐波那契数 但我发现,在第48位或更高的位置产生斐波那契数需要20秒以上的时间。你能解释一下为什么这个小谎制作人效率这么低吗 例如,这里我附加了一个简单的测试客户端: public static void main(String[] args) { int hi = 50; System.out.println("Sequance, elapsed time, number"); for (i

以下递归方法旨在为给定整数(用Java编写)生成斐波那契数

但我发现,在第48位或更高的位置产生斐波那契数需要20秒以上的时间。你能解释一下为什么这个小谎制作人效率这么低吗

例如,这里我附加了一个简单的测试客户端:

  public static void main(String[] args)
   {
       int hi = 50;

       System.out.println("Sequance, elapsed time, number");

       for (int n = 0; n<= hi; n++)
       {
            long start = System.currentTimeMillis();
            long fib_num = fib(n);
            long end = System.currentTimeMillis();
            long elapse = (end-start)/1000;  
            System.out.printf("%d, %d, %d%n", n, elapse, fib_num);
       }
   }
这是一个经典的递归问题,其中动态规划起到了解救作用

实际发生的情况是,您的代码执行了一些已经完成的重新计算,因此导致额外的机器周期和高处理时间

上图描述了您的程序如何计算第5个斐波那契数。 我们可以看到函数f(3)被调用了2次fib(2)3次fib(1)5次,而不是一次计算

解决方案 如果我们存储了f(3)、f(2)、f(1)的值,那么我们可以重用旧的存储值,而不是再次计算它。 从这里你可以进行研究,并可以阅读

这是一个经典的递归问题,其中动态编程起到了解救作用

实际发生的情况是,您的代码执行了一些已经完成的重新计算,因此导致额外的机器周期和高处理时间

上图描述了您的程序如何计算第5个斐波那契数。 我们可以看到函数f(3)被调用了2次fib(2)3次fib(1)5次,而不是一次计算

解决方案 如果我们存储了f(3)、f(2)、f(1)的值,那么我们可以重用旧的存储值,而不是再次计算它。
从这里你可以进行研究,并可以阅读

这是一个经典的例子,你应该使用备忘录。你需要记住已经计算过的数字。简单地说,您需要维护一个数据结构,它可以是一个数组,在这种情况下,它将保存该索引的斐波那契数

示例数组如下所示(从索引0开始)

0,1,1,2,3,5,8,13


因此,每当需要计算斐波那契数时,首先检查数组中是否已经计算了斐波那契数。如果是,则从数组中返回它。如果没有,则计算它并将其存储在数组中。

这是一个典型的示例,您应该在其中使用记忆。你需要记住已经计算过的数字。简单地说,您需要维护一个数据结构,它可以是一个数组,在这种情况下,它将保存该索引的斐波那契数

示例数组如下所示(从索引0开始)

0,1,1,2,3,5,8,13


因此,每当需要计算斐波那契数时,首先检查数组中是否已经计算了斐波那契数。如果是,则从数组中返回它。如果没有,则计算它并将其存储在数组中。

这主要是因为这种生成斐波那契数的实现效率极低

这种特殊的算法是指数增长而不是线性增长的,因为Fibonacci的每一个调用都会分支成两个以上的调用,并在这条轨道上继续。因此,增加N的大小会大大增加完成所需的时间

更好的方法是跟踪以前的值以计算下一个值

long fibbonaci(int n) {
    long c = 0, k = 1;
    for (int i = 0; i < n; i++) {
        k += c;
        c = k - c;
    }
    return c;
}
long fibbonaci(int n){
长c=0,k=1;
对于(int i=0;i
这主要是因为这种生成斐波那契数的实现效率极低

这种特殊的算法是指数增长而不是线性增长的,因为Fibonacci的每一个调用都会分支成两个以上的调用,并在这条轨道上继续。因此,增加N的大小会大大增加完成所需的时间

更好的方法是跟踪以前的值以计算下一个值

long fibbonaci(int n) {
    long c = 0, k = 1;
    for (int i = 0; i < n; i++) {
        k += c;
        c = k - c;
    }
    return c;
}
long fibbonaci(int n){
长c=0,k=1;
对于(int i=0;i
因为递归斐波那契效率低下。做一些分析,比如说fib(8),看看确切的原因。因为递归Fibonacci效率很低。做一些分析,比如fib(8),看看原因到底是什么。你在每一步花多少时间搜索数组?您真的需要记住前面所有的数字还是只记住最后两个?访问数组元素所花费的时间是O(1),因为它的索引将被使用,并且不会在整个数组中搜索。只维护最后2个就可以了,这样可以节省空间。啊,对了……我想象你在数组中寻找
13
(这当然是愚蠢的),而不是
array[n-1]
。你在每一步中花多少时间搜索数组?您真的需要记住前面所有的数字还是只记住最后两个?访问数组元素所花费的时间是O(1),因为它的索引将被使用,并且不会在整个数组中搜索。只维护最后2个就可以了,这样可以节省空间。啊,对了……我想象你在数组中查找
13
(当然是哑的),而不是
array[n-1]
long fibbonaci(int n) {
    long c = 0, k = 1;
    for (int i = 0; i < n; i++) {
        k += c;
        c = k - c;
    }
    return c;
}