2016-04-26 11 views
-4

Bitte zeigen Sie den Fehler in der unteren Code: #include mit Namespace std;Fehler im selbstgeschriebenen Code für Fakultät einer Zahl in C++

int factorial(int n) { 
    int f=1; 
    factorial(0)=1; 
    factorial(1)=1; 
    while(n>=0) 
    { 
     f=f*factorial(n); 
     n=n-1; 
    } 
    return f; 
} 

int main() { 
    cout << factorial(5); 
} 

im Compiler, ich bin der Fehler immer "L-Wert als linker Operand der Zuordnung faktoriellen (0) = 1 erforderlich;"

Ich kann den obigen Fehler nicht verstehen. Bitte erkläre.

+0

Ihre Syntax ist sehr falsch. Vielleicht möchten Sie ein gutes Buch, eine Klasse oder ein Tutorial zu C++ finden (oder überprüfen Sie das Material, wenn Sie dies bereits tun). – crashmstr

+0

Was versuchen Sie zu erreichen? Sie können einem Funktionsaufruf keinen Wert zuweisen factorial (0) = 1; ' – RomCoo

+1

Was Sie mit den Faktoren (factorial (0) = 1;' und factorial (1) = 1; zu tun versuchen) wird hier geschrieben Weg: 'Wenn (n <= 1) 1 zurückgeben – Kapobajza

Antwort

1

Ihr Code ist wirklich falsch. Sie können einem Wert keine Funktion zuweisen. Ich denke, Sie suchen nach etwas in der Art:

#include <iostream> 
using namespace std; 

int Factorial(int n) 
{ 
    if (n <= 1) 
     return 1; 

    return n * Factorial(n - 1); 
} 

int main() 
{ 
    int number = Factorial(5); 
    cout << number << endl; 
} 
+0

Sie können keinem Funktionsergebnis einen Wert zuweisen, weil eine Funktion selbst _returns_ bereits einen Wert als Ergebnis zurückgibt, dh 'int function (int)' _returnns_ an 'int' als Ergebnis. – user3078414

+0

@Rohit Sharma Wirklich reif, Leute Idioten und Idioten zu nennen, wenn Sie derjenige sind, der das Thema nicht versteht und die "Idioten" nur versuchen, Ihnen zu helfen, zu verstehen. Viel Glück mit dieser Einstellung in der Zukunft Hilfe zu bekommen. –

+0

Oh wirklich? Und hilfst du mir wirklich? Alles, was jeder nur sagt, ist zurück zu deinen Konzepten oder Sprache erlaubt nicht oder bla bla bla .. Aber niemand konzentriert sich auf den Punkt, warum Sprache so getan hat .. Nur user3078414 kam nahe genug, um meine Abfrage zu lösen –

0

C++ erlaubt keine Muster-Matching-Funktion Definitionen.

0

Update: Dieser ist wie in der Schule am Samstag ...

#include <iostream> 
#include <unordered_map> 

int& factorial(int n) { 
    static std::unordered_map<int,int> memo = {{0,1},{1,1}}; 
    if(!memo.count(n)) { 
     memo[n] = n * factorial(n-1); 
    } 
    return memo[n]; 
} 

int main() { 
    using std::cout; 

    cout << factorial(1) << '\n'; 
    cout << factorial(5) << '\n'; 
    cout << " ----\n"; 
    factorial(1) = 123456789;  // make factorial(1) better 
    cout << factorial(1) << '\n'; 
    cout << factorial(5) << '\n'; // factorial(5) is still 120 
    //        because its value was saved 
    //        by the first factorial(5) call 
} 

Es ist wie das Original Beispiel verhält, aber die memoized Ergebnisse für factorial(0) und factorial(1) hatten mit einer init-Liste hinzugefügt werden, leider. Starten mit factorial(0) = 1; hätte unendliche Rekursion verursacht. Wenn diese Version mit einem Wert von n aufgerufen wird, fügt sie dem Memo automatisch alle fehlenden Faktorwerte hinzu, und zwar für alle positiven Ganzzahlen < = n. Das Beste von allem, kann der Benutzer noch das Memo-Ergebnis für jede Eingabe wie folgt anpassen: factorial(5) = 0;

Hier ist ein Beispiel, das Klassen und Junk verwendet.

#include <iostream> 
#include <unordered_map> 

class factorial { 
    static std::unordered_map<int,int>& map() { 
     static std::unordered_map<int,int> outs; 
     return outs; 
    } 
    int n; 
public: 
    factorial(int n) : n(n) {} 
    factorial& operator = (int out) { 
     map()[n] = out; 
     return *this; 
    } 
    operator int() const { 
     if(map().count(n)) return map()[n]; 
     return factorial(n-1) * n; 
    } 
}; 

int main() { 
    using std::cout; 

    // need to set low factorial values 
    // to prevent infinite recursion 
    factorial(0) = 1; 
    factorial(1) = 1; 

    cout << factorial(1) << '\n'; 
    cout << factorial(5) << '\n'; 
    cout << " ----\n"; 
    factorial(1) = 123456789;  // make factorial(1) better 
    cout << factorial(1) << '\n'; 
    cout << factorial(5) << '\n'; // now factorial(5) is all messed up 
    cout << " ----\n"; 
    factorial(5) = 120;   // fix factorial(5) 
    cout << factorial(5) << '\n'; // worked! 
} 

Ausgang:

1 
120 
    ---- 
123456789 
1929912792 
    ---- 
120 

Live Demo

+0

Sie sind wirklich rätselhaft .. –