2016-08-24 1 views
-1

Wie zu implementieren Java-Methode ln(n!) rekursiv zu berechnen?Java-Methode für die Berechnung ln (n!) Rekursiv

Das ist meine Lösung. Ich weiß, dass es falsch ist, aber das ist die einzige Lösung, die mir bisher gekommen ist.

double func(int n) { 
    double result; 
    if(n == 1) 
    return 1; 
    result = func(n-1) * n; 
    return Math.log(result); 
} 

Dies ist, was die Funktion gibt:

func(2) = 0.6931471805599453 (correct) 
func(3) = 0.7320993680864453 (should be: 1.79175946922805500081) 
func(4) = 1.0744553356380115 (should be: 3.17805383034794561964) 
+1

Ihre Lösung ist nicht falsch, aber es gibt Möglichkeiten, dies zu berechnen, die größere 'n' ohne Überlauf bewältigen können. –

+0

Wenn Sie die Methode selbst nicht aufrufen, ist kein rekursiver Aufruf. – danielbathke

+1

Ja, natürlich. Sie möchten die Ingamma-Funktion: http://mathworld.wolfram.com/LogGammaFunction.html. Grundlegende faktorielle Implementierungen, insbesondere die rekursiven, sind fehlgeleitet. – duffymo

Antwort

4

Das, was zu beachten ist, dass ln(n*x) = ln(n) + ln(x) und ln(1) = 0:

double func(int n) { 
    if(n==1) 
    return 0; 
    return func(n-1) + Math.log(n); 
} 
+2

A Die rekursive Lösung für alles, was mit Faktoren zu tun hat, ist einfach zu programmieren, aber hoffnungslos naiv. – duffymo

+0

Davon habe ich gesprochen ... Methode "func" nennt sich "func". Das ist ein rekursiver Aufruf. – danielbathke

+1

Ich sage, das ist eine schlechte Idee. Du solltest verstehen warum. – duffymo

1

Sie die Gamma-Funktion wollen, weil Gamma (n) = (n-1)!

https://en.wikipedia.org/wiki/Gamma_function

Noch besser noch, hat lngamma schöner Eigenschaften, die Berechnung n machen!/M! (N-m)! einfach.

Verwenden Sie nicht die naive rekursive Fakultät, die Schüler so sehr lieben. Es ist ineffizient (keine Tail-Rekursion in Java; keine Memokopie) und begrenzt, wenn Sie einen anderen Typ als double zurückgeben. Lieber ein Double zurückgeben.

+2

Aber hier gibt es keine rekursive Fakultät. Es ist eine rekursive ** Summe ** ... –

+0

Rekursion ohne Tail-Rekursion wird für große n immer noch ineffizient sein. Mein Punkt ist, dass es einen besseren Weg gibt, den die meisten Menschen nicht kennen. Die Gamma-Funktion und ihre Beziehung zur Fakultät ist jedem bekannt, der Bessel-Funktionen und die Methode von Frobenius zur Lösung von ODEs studiert hat, aber das ist nicht Ihr Lauf der Mühle Entwickler. Es ist wissenswert. – duffymo

+2

Ich stimme völlig zu, dass Sie [Mathe die Scheiße es] (https://www.youtube.com/watch?v=d6lYeTWdYLw) (youtube link), ich denke nur, dass möglicherweise ein wenig Mathematik auf einmal - grundlegende Protokoll Arithmetik zuerst, alles andere später ... –

Verwandte Themen