2016-09-07 1 views
-1

habe ich dieses Stück Code:Übung - Reason Programm läuft langsam und wie man es beheben

public class Fibonacci { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    final int SIZE; 

    if (args.length == 0) { 
     SIZE = 100; 
    } else { 
     SIZE = Integer.parseInt(args[0]); 
    } 

    Stopwatch stopwatch = new Stopwatch(); 

    for (int n = 1; n <= SIZE; n++) { 
     double timeStart = stopwatch.elapsedTime(); 
     long fiboNumber = fib(n); 
     double timeEnd = stopwatch.elapsedTime(); 
     System.out.print(n + " " + fiboNumber + "\t"); 
     double lapTime = timeEnd - timeStart; 
     System.out.printf(" (%.3f \t %.3f)\n", lapTime, timeEnd); 
    } 
} 

public static long fib(int n) { 
    if (n < 2) { 
     return n; 
    } else { 
     return fib(n - 1) + fib(n - 2); 
    } 
} 
} 

Das Ziel dieses Programms ist es so zu modifizieren, das Programm glatt läuft. Jetzt, wenn das Programm läuft wird der Zähler langsam um 40 gehen. Ich kann einfach nicht herausfinden, warum das passiert und wie ich es beheben kann, so läuft es glatt zu 100.

+0

Sie müssen die rekursive Funktion verwenden? –

+4

Warum berechnen Sie etwas, das Sie bereits berechnet haben? Wenn Sie jedes Element in der Fibonacci-Sequenz bestimmen, speichern Sie sie in einem Array. Anstatt sie jedes Mal neu zu berechnen, beziehen Sie sich einfach auf die, die Sie bereits berechnet haben. – David

+0

Sie drucken grundsätzlich die Fibonacci-Serie. Es gibt andere Möglichkeiten, dies in sehr kurzer Zeit zu tun! Hier machst du einige Dinge, die du bereits berechnet hast, also wird die Zeit jedes Mal fast doppelt so groß, so dass es mit der Kraft von 2 zunimmt. –

Antwort

0

Der Grund, warum es geht Langsam bei etwa 40 ist, dass die Fibonacci-Funktion viel Zeit damit verbringt, die ganze Zahl zu berechnen. Verwenden Sie anstelle einer rekursiven Implementierung von Fibonacci eine dynamische Programmierimplementierung.