2017-02-14 4 views
0

Warum ist meine Lösung zum Binomialkoeffizienten Absturz? Ich habe wirklich versucht, Rekursion zu lernen, aber ich denke immer noch, dass ich darüber nicht klar bin. Ich frage mich, ob jemand mir helfen kann, Rekursion zu lernen und rekursiv zu denken?Binomialkoeffizient rekursive Lösung in C

Selbst wenn ich einen guten Basisfall schreibe, stürzt mein Programm ab. Jeder Link, um Rekursion mit klarer Demonstration zu lernen, wäre sehr hilfreich für mich.

Hier ist mein Code für Binomialkoeffizienten, und ich bin nicht in der Lage, den Bug/Fehler zu finden, auf der Suche nach Ihrer Hilfe.

Code:

#include<stdio.h> 

long long m,n,o,p,result; 

long long binomial(long long n,long long m) 
{ 
    if(n==m) 
     return 1; 
    else { 
     if(m==0) 
      return 1; 
     else { 
      o=binomial(n-1,m); 
      p=binomial(n-1,m-1); 
      return o+p; 
     } 
    } 
} 

int main() 
{ 
    printf("Please Enter The Value Of n:\n"); 
    scanf("%lld",&n); 

    printf("Now Enter The value of m:\n");  
    scanf("%lld",&m); 

    result = binomial(n,m); 
    printf("Resultant Binomial coefficient: %lld\n",result); 
    return 0; 
} 
+0

in diesem Teil: m = binomischer (n-1, m); n = Binomial (n-1, m-1); Sie können Ihren m-Wert nicht durch das neue Ergebnis ersetzen, weil Sie den ursprünglichen m-Wert für den zweiten binominalen Aufruf benötigen. – algojava

+0

@David Hoelzer danke für Ihre Hilfe, aber jetzt habe ich eine Änderung in meinem Code, würden Sie bitte sehen, warum es immer noch nicht funktioniert?hier ist der code: –

+0

#include lang lang m, n, ergebnis, o, p; lange lange binomial (lange lange n, lange lange m) { if (n == m) zurück 1; else { if (m == 0) return 1; else { o = Binomial (n-1, m); p = Binomial (n-1, m-1); Rückgabe o + p; } } } int main() { printf ("Bitte geben Sie den Wert von n: \ n"); scanf ("% LLD" &n); printf ("Jetzt ist der Wert von m eingeben: \ n"); scanf ("% LLD", &m); result = binomischen (n, m); printf ("Resultierende Binomialverteilung Koeffizient:% lld \ n ", Ergebnis); return 0; } –

Antwort

0

Der Binomialkoeffizient nur für Paare definiert ist n und kwenn n> = k. Es ist üblich, n und k in binomischen Koeffizientenausdrücken zu verwenden, aber diese entsprechen n und m in Ihrem Code.

Sie müssen eine Fehlerüberprüfung der Eingabe einbeziehen, um Probleme zu vermeiden. Ihr Code stürzt ab, wenn n weniger als m, weil jedes Mal, wenn die Anweisung o=binomial(n-1,m); ausgeführt wird, wird der Wert von n in der aufgerufenen Funktion reduziert wird, aber n ist bereits kleiner als m, die nicht Null ist (wenn m Null wären die Funktion einfach haben würde zurückgegeben 1), so n == m kann nie auftreten.

Übrigens können Sie Ihren Code auf einige Arten verbessern. Verwendung von globalen Variablen ist generell eine schlechte Idee, und es wäre besser, die Erklärung zu bewegen:

long long m, n, result; 

in main(), wo diese Variablen benötigt. Außerdem sollte die Funktionssignatur für main()int main(void) lauten. Und Sie können deutlich die Logik in der binomial() Funktion straffen, wodurch die Notwendigkeit für o und p:

long long binomial(long long n,long long m) 
{ 
    if (m != 0 && n != m) { 
     return binomial(n-1, m) + binomial(n-1, m-1); 
    } else { 
     return 1; 
    } 
} 
+0

verwendet ich normalerweise keine globalen Variablen Ich weiß, es ist eine schlechte Idee, danke.hmm, Das war wirklich hilfreich Kumpel und jetzt habe ich meinen Fehler verstanden, vielen Dank für Ihre massive Hilfe @David Bowling –