2016-11-30 9 views
2

Ich habe immer noch Probleme mit der grundlegenden Rekursion. So habe ich zwei Funktion gezeigt alsKonvertieren in eine rekursive Funktion?

unsigned long factorial(int x) 
{ 
    // recursive function to find factorial 

    if(x==1) 
     return 1; // base case 
    return x * (factorial(x-1)); // recursive call 
} 


int choose(int choose, int choose_from) 
{ 
    // function to find how many different ways to "choose" 
    // calls factorial function multiple times 

    return factorial(choose_from)/(factorial(choose) * factorial(choose_from - choose)); 
} 

Mein Lehrer sagte mir, das ist eigentlich falsch ist, und ich sollte in der Auswahl-Funktion werden Rekursion. Ich sehe nicht, wie seit der Wahl Formel als C (n, r) = n gegeben ist!/(r! · (n - r)!), und da alles, was rekursiv ist, die Faktoren ist, habe ich nur eine separate faktorielle Funktion gemacht.

Wie würden diese beiden Funktionen, ohne neue Bibliotheken zu verwenden, zu einer rekursiven Funktion werden?

+0

Es gibt fast unendlich viele Beziehungen zwischen Binomen. Wählen Sie eine, die geeignet rekursiv erscheint. Benutze es. –

+3

Nun, Sie müssen nicht die vollständigen Faktoren berechnen, wie Sie es jetzt tun, um C (n, r) zu berechnen. Schreiben Sie die Formel auf Papier und löschen Sie die Werte - Sie sollten mit nur ein paar Multiplikationen verlassen werden. Zum Beispiel 'C (52, 51)' - Sie müssen sicherlich nicht 52 berechnen! und 51! um die Antwort zu bekommen. – PaulMcKenzie

+0

Ich denke, ** ein guter Weg, sich dem zu nähern, besteht darin, Pascals Dreieck darzustellen, indem man jede Zahl von der vorherigen auf dieser Linie berechnet, wobei eine feste Anzahl von arithmetischen Operationen pro Zahl verwendet wird. Die Berechnung kann Informationen wie die Platzierung der Nummer in der Zeile verwenden. Ich erinnere mich, dass ich das in der High School gemacht habe (auf einem i8085 Computer), also ist es sehr machbar und lehrreich. Dies gibt Ihnen dann eine Beziehung, die leicht als eine rekursive Formel ausgedrückt werden kann. Und dann in Ihrer 'Choose' Funktion verwendet. –

Antwort

1

Bitte beachten Sie, dass die Reihenfolge der Argumente in Ihrer choose-Funktion gegenüber denen in der C-Funktion geändert ist.

Jetzt Ihr Lehrer, was bedeutet, dass er die Auswahl-Funktion rekursiv zum Beispiel wie so will:

C(n, r) = n!/(r! · (n – r)!) = n/(n-r) * (n-1)!/(r! · (n -1 – r)!) = n/(n-r)*C(n-1, r) 
+0

sicherlich C (n, r) = n * C (n, r) ist falsch; ein Tippfehler? –

+0

@ Cheersandhth.-Alf behoben –

+0

Oh. Nun, C (n, r) = n * C (n-1, r) reduziert sich auf reine Fakultät, also ist das auch ein bisschen falsch? –

4

Ich denke, Ihr Lehrer möchte, dass Sie diese recurrent definition verwenden:

C(N, 1) = N 
C(N, K) = C(N, K-1) * (N + 1 - K)/K 

Diese Definition können Sie vermeiden, factorial zu verwenden, rekursiv innerhalb Ihrer choose Funktion.

+0

Ich frage mich, ob von den Studenten erwartet wurde, dass sie die wiederkehrende Definition ableiten können. Mit einer Helfer (Eingabe) -Funktion könnte die Anzahl der Rekursionen reduziert werden, indem mit C (N, K) = C (N, min (N - K, K)) begonnen wird, wobei min() die Minimalwertfunktion ist. Zum Beispiel C (10,8) == C (10,2) – rcgldr

+0

Die wiederkehrende Definition sollte mit C (N, 0) = 1 beginnen. Siehe [Randwerte] (http://en.wikipedia.org/wiki/ Binomialkoeffizient # Rekursive_Formel) – rcgldr