2016-11-12 2 views
-3

die meisten Menschen versuchen, Fakultäts-Funktion mit der Funktion Rückgabetyp zu implementieren setzt auf int, Doppel- oder long.The Code kann normalerweise sein:Warum Leute sagen "faktorielle Methode funktioniert nicht gut!" in Java?

int fact(int n){ 
     int result; 
     if(n==1){ 
      return 1; 
     }else{ 
      result = fact(n-1) * n; 
      return result; 
     } 
    } 

Aber wenn Sie wollen größer finden als 170 .Does! Der obige Code funktioniert in Java richtig?

+0

Wenn Sie genug RAM haben ... –

+2

Hören Sie nicht, was "Leute" sagen. –

+1

Ich stimme ab, diese Frage als off-topic zu schließen, weil wir kaum sagen können, was andere Leute denken. Diese Frage ist auch nicht im Q & A-Stil. –

Antwort

0

Für sehr große faktorielle Werte müssen Sie einen Datentyp verwenden, der mehr als 170! enthalten kann. Ändern Sie den Code wie folgt:

public static BigInteger fact(BigInteger n) 
{ 
    BigInteger result; 
    if (n.compareTo(BigInteger.ONE) <= 0) 
    { 
     return BigInteger.ONE; 
    } 
    else 
    { 
     return n.multiply(fact(n.subtract(BigInteger.ONE))); 
    } 
} 
+0

Können Sie erklären, wie BigIntiger Speicher reserviert? Ist dieser abhängig vom verfügbaren RAM-Speicher? –

+0

Ja, es reserviert Speicher dynamisch, abhängig von der Größe des BigIntegers. Ein 1000-stelliger BigInteger benötigt mehr Speicherplatz als ein 5-stelliger. Beachten Sie, dass BigIntegers im Allgemeinen im Vergleich zu den einfachen Skalartypen wie "int", "long" oder sogar "double" ziemlich langsam sind, da alle Berechnungen in Software und nicht in Hardware durchgeführt werden. Und ein iterativer Ansatz für faktorielle Prozesse kann auch schneller als ein rekursiver sein. –

+0

Was ist der Grund für "iterativen Ansatz für faktorielle kann schneller als ein rekursive sein?" .General Zeit Komplexität beider Ansatz sind O (n) .Dann, wie die beiden Ansätze schneller variieren? –

Verwandte Themen