2016-08-15 6 views
-6

Ich versuche, den folgenden Code fortzusetzen, aber das Ergebnis ist Segmentierungsfehler (Core Dumped). Wie kann ich den Fehler beheben? Wird mein Code das Fibonacci-Orial von 100 erzeugen? Mein Code ist wie folgt.Wie kann ich den Fehler beheben?

#include <iostream> 

using namespace std; 
int fib(int); 
int main() 
{ 
    int n; 
    int result[100]; 
    for (int i=0;i<100;i++){ 
     result[i] = fib(i); 
    } for (int i=0;i<100;i++){ 
     cout << i+ 1 << " : " << result[i] << endl; 
    } 

} 
int fib(int n){ 
    int re; 
    if (n==0||n==1){ 
     re = 1; 
    } else{ 
     re = fib(n)*fib(n - 1); 
    } 
    return re; 
} 

der Fibonacci-ORIAL

Fibonacci-Folge F (n) auf den positiven ganzen Zahlen, sind als solche definiert:

1. F(1) = 1 
2. F(2) = 1 
3. F(n) = F(n-1) + F(n-2), where n is an integer and n > 2 

Die Fibonacci-ORIAL einer positiven ganzen Zahl ist das Produkt von [F (1), F (2), ..., F (n)].

re = fib(n)*fib(n - 1); 

für

re = n * fib(n - 1); 

oder Sie werden in einer Endlosschleife am Ende:

Das Fibonacci-orial von 20

n Fibonacci-orial of n 
1 1 
2 1 
3 2 
4 6 
5 30 
6 240 
7 3120 
8 65520 
9 2227680 
10 122522400 
11 10904493600 
12 1570247078400 
13 365867569267200 
14 137932073613734400 
15 84138564904377984000 
16 83044763560621070208000 
17 132622487406311849122176000 
18 342696507457909818131702784000 
19 1432814097681520949608649339904000 
20 9692987370815489224102512784450560000 
+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist, Ihren Debugger zu verwenden, aber nicht bei Stack Overflow zu fragen, bevor Sie dies getan haben. Nennen Sie uns all Ihre Beobachtungen, die Sie gemacht haben, als Sie Ihren Code Schritt für Schritt auf Platz 1 durchgesehen haben. Vielleicht möchten Sie auch lesen [** Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) **] At Lassen Sie uns mindestens einen ** [MCVE] **, der Ihr Problem reproduziert. (Dies ist ein persönlicher Aktienkommentar von πάντα ῥεῖ ™) –

+0

Segmentierungsfehler in einem Fall wie diesem bedeutet wahrscheinlich, dass der rekursive 'fib' Aufruf zu weit gegangen ist .... überprüfe deine Beendigungsbedingung und wenn das in Ordnung ist, brauchst du vielleicht um es in einer iterativen Art und Weise anstatt Rekursion neu zu schreiben, weil die Tiefe zu viel ist –

+0

Und dieses fib (n) berechnet fib (n + 1) oder -1, hängt davon ab, wie Sie darauf schauen. Wie auch immer, es hilft der Klarheit nicht, das + -1 auf dieser Ebene einzuführen. Sie wollten wahrscheinlich, dass es in das 'result []' von '0' Index gespeichert wird? Verschwenden Sie lieber das 0. Element von 'result [101]', oder verwenden Sie 'result [n-1] = fib (n)', und halten Sie 'n' innerhalb von' fib() 'von 1 nach oben. (Fixieren des abschließenden 'if' natürlich). Also wird dein 'fib()' dann direkt aussehen wie die Theorieformel => das Finden von Fehlern erleichtert. Wiederum sollten alle "For" -Schleifen "für (n = 1; n <= 100; ++ n)" sein. Mensch bleiben, sich nur als letzter Ausweg der Maschinenlogik beugen. – Ped7g

Antwort

0

einfach die Linie ändern.

In Bezug auf die Berechnung der ersten 100 faktoriellen Zahlen, ja, Ihr Code kann sie berechnen, aber die Ergebnisse passen nicht in eine int Variable. Für weitere Informationen gibt es mehrere Antworten in SO über die Berechnung der Fakultät von großen Zahlen: 1, 2, 3.

0

Sie sollten die Zeile ändern re = fib (n) * fib (n - 1);

in: re = fib (n-2) + fib (n - 1);

Ich denke, Fibonacci wie mit einer Addition berechnet - durch Aufruf von fib (n-2) anstelle von fib (n), entfernen Sie Ihre endlosen rekursiven Funktion-Aufrufe - und ich denke, es entspricht dem richtigen Algorithmus für Fibonacci.

0
int main() 
{ 
    int n; 
    int result[100]; 
    int iPrevResult = 1; 
    for (int i=0;i<100;i++) 
    { 
     iPrevResult = iPrevResult* fib(i); 
     result[i] = iPrevResult; 
    } 

    for (int i=1;i<100;i++) 
    { 
     cout << i+ 1 << " : " << result[i] << endl; 
    } 
} 
int fib(int n){ 
    if (n<=1){ 
     return 1; 
    } 
    return (fib(n-1) +fib(n-2)); 
} 
Verwandte Themen