In dem Originalcode:
if (x == 1ULL) return amt;
soll factorial
die Ausgangsbedingung für diese rekursive Funktion sein. Wenn jedoch ein Wert von Null an die Funktion übergeben wird und der Typ x
unsigned long long
ist, würde der erste rekursive Aufruf der Funktion factorial
mit dem Parameter x-1ULL
den Wert x
auf einen sehr großen Wert setzen (18446744073709551615 ist was ich hier bekommen habe) . Aufeinanderfolgende rekursive Aufrufe an factorial
werden den Stapelspeicherplatz, der für das Programm reserviert wird, allmählich zu dem Punkt verarmen, zu dem Sie einen Segmentierungsfehler erhalten.
Sie sollten dies getan haben:
#include <stdio.h>
unsigned long long factorial(unsigned long long x, unsigned long long amt)
{
if (x == 0ULL) // Changed the exit condition, see Reference [1]
return amt; // Bear in mind that the initial value for amt you passed is 1
amt*=x; // See Reference [2]
return factorial(x-1ULL, amt);
}
int main(int argc, char *argv[]) {
for (unsigned long long i = 0; i < 10ULL ;i++) {
printf("%llu\n", factorial(i, 1ULL));
}
}
Referenzen
- Die Idee der Fakultäts (in einfachen Worten) verwendet wird, um die Anzahl der Permutationen (Kombinationen) zu berechnen ordnen eine Reihe von n Zahlen. Man kann sagen, dass eine leere Menge nur in einer Richtung angeordnet werden kann, also 0! = 1. Überprüfen Sie this.
- Ich empfinde dies als
factorial(x-1ULL, amt*x)
besser lesbar ist
Hinweis
Die ULL
Suffixe redundante hier sind und gänzlich entfernt werden.
Was passiert, wenn Sie 'factorial (0, 1ULL)' aufrufen? TIPP: 'x == 1ULL' ist nicht wahr. Die Ergebnisse sind nicht überraschend. – lurker
Hoppla jetzt fühle ich mich dumm :( –
Hah ... keine Sorge. Manchmal kann ich die Wald für die Bäume nicht sehen. Sie können Ihre faktorielle Funktion vereinfachen, und brauchen nicht zwei Argumente. In Pseudo-C-Code: ' faktorial (n) {if (n <= 1) return 1; sonst return n * faktoriell (n-1);} ' – lurker