Rekursive Funktion Hilfe



  • Halli Hallo,

    ich bin gerade ein bisschen Ratlos mit Rekursiven Funktionen.
    Das Grundprinzip hab ich verstanden. Allerdings ist da ein kleines Problem, dem ich schon öfter begegnet bin und auf das ich mir keinen Rat weiß.

    Ich hab dazu ein kleines Übungsprogramm zur Potenzberechnung geschrieben (Und ja ich weiß, dass es in der Aktuellen verfassung nicht das macht was es soll^^. Bevor ich allerdings das Problem nicht verstehe werde ich nicht weiter an der Aufgabe feilen):

    int potenz(int base,int expo){
    
        if(expo==1){
            return base;
        }
        return (base,expo-1);
    
    }
    
    int main() {
    
        int basis,exp;
        int ergebnis;
    
        cout << "Basis: " , cin >> basis;
        cout <<endl;
        cout << "exponent: ", cin >> exp;
        cout <<endl;
        ergebnis=potenz(basis,exp);
        cout << "Ergebnis: " <<ergebnis;
    
        return 0;
    }
    

    Also zu meinem eigenen Verständnis: Unten wird eine Basis und ein Exponent eingegeben. Die Basis sei z.B 4 und der Exponent 3. Diese werden in die Funktion übergeben. Die Funktion oben ruft sich so lange selbst auf, bis der Exponent=1 ist und gibt dann den Wert der Basis zurück was in diesem Falle 4 ist. Die Aufgerufene Stelle, welche die 4 dann zurückerhalten sollte, sollte die 4 dann wieder an die nächste Aufgerufene stelle zurückgeben usw, bis wir wieder beim Ausgang sind.
    Die Realität: Er gibt mir immer etwas anderes aus. In dem Beispiel mit 3 und 4 gibt er mir z.B ne 2 aus. Gebe ich als Basis 6 und als Exponent 2 ein, gibt er mir eine 1 aus...

    Könnte mir bitte jemand erklären was da passiert und warum?
    Vielen Dank schonmal.



  • In Zeile 6 rufst du nicht potenz auf, sondern rufst den Komma-Operator auf. Korrekt wäre potenz(base, expo - 1).
    Aber das wird dir dennoch nicht die Potenz geben. Über den Algo solltest du noch mal in Ruhe nachdenken.



  • return (base,expo-1);
    return potenz(base,expo-1);

    Funktionsaufruf Syntax ist immer gleich:
    funktionsname(argumente)



  • Ah mann! 😃 Natürlich!
    Wie konnte ich das übersehen... dankesehr!



  • Cabooze schrieb:

    Ah mann! 😃 Natürlich!
    Wie konnte ich das übersehen... dankesehr!

    Man schreibt schon mal Blödsinn. Mit nem Debugger kommt man oft schnell dahinter ...



  • int potenz(int base, int expo){
    
        if(expo==1){
            return (base);
        }
        return base*potenz(base,expo-1);
    
    }
    
    int main() {
    
        int basis,exp;
        int ergebnis;
    
        cout << "Basis: " , cin >> basis;
        cout <<endl;
        cout << "exponent: ", cin >> exp;
        cout <<endl;
        ergebnis=potenz(basis, exp);
        cout << "Ergebnis: " <<ergebnis;
    
        return 0;
    }
    

    So passt! 😃



  • manni66 schrieb:

    Cabooze schrieb:

    Ah mann! 😃 Natürlich!
    Wie konnte ich das übersehen... dankesehr!

    Man schreibt schon mal Blödsinn. Mit nem Debugger kommt man oft schnell dahinter ...

    Der Debugger von Netbeans funktioniert öfter nicht. Wie jetzt gerade auch... 😡 Krieg ständig ne fehlermeldung.
    Sonst hätt ich es längst gemacht.



  • Nebenbei als Anmerkung noch die Antwort auf die eigentliche Frage, auch wenn sie nicht mehr benötigt wird 😉 :

    Obwohl ich mich schon seit etlichen Jahren mit C++ befasse und ich eigentlich dachte, dass diese Sprache nicht mehr allzu viele Geheimnisse vor mir haben kann, habe ich mir die selbe Frage gestellt wie Cabooze: "Was passiert da und warum?".

    Man lernt bei C++ doch nie wirklich aus. Ich dachte tatsächlich immer solche durch Komma separierte Ausdrücke könnte man nur bei for-Schleifen verwenden - tatsächlich ist das Komma tatsächlich ein Operator, bei dem der linke und der rechte linke Ausdruck mit allen Nebeneffekten ausgewertet werden und der Gesamtausdruck den Wert des Ausdrucks rechts vom Komma erhält:

    return (base,expo-1);

    Wertet also base mit Nebeneffekten aus (Das hätte z.B. Relevanz wenn dort base++ stünde und base global wäre. So wird es wahrscheinlich eh nur rausoptimiert) und gibt expo-1 zurück. Womit sich auch die Rückgabewerte in der ersten Version erklären.

    Da habe ich wieder etwas dazgelernt. Hab das Komma bei den "anderen Operatoren" wohl nie so richtig wahrgenommen... was mir allerdings ein wenig Angst macht, ist, dass man das Komma sogar überladen (!) kann 😮

    Gruss,
    Finnegan



  • Finnegan schrieb:

    Da habe ich wieder etwas dazgelernt. Hab das Komma bei den "anderen Operatoren" wohl nie so richtig wahrgenommen... was mir allerdings ein wenig Angst macht, ist, dass man das Komma sogar überladen (!) kann 😮

    Ja, genau wie && und || und Scott Meyers schreibt kapitelweise darüber, dass man es kann und wieso man es nicht machen sollte.



  • Übrigens bringt mich das Debugger Problem langsam auf die Palme. ich weiß auch gar nich unter welchem Thema ich das hier reinschreiben müsste wenn ich ein neuen Thread aufmachen wollte.
    Bei vielen (nicht bei allen) programmen die ich mit Neatbeans debuggen will kommt ein Error mit : C:/nutzer/dokumente/netbeansprojects/projektname/debug/cygwin_4.x-windows/projektname: no such file or directory.
    Was kann ich da machen?



  • Unter Windows ist die Visual Studi IDE ungeschlagen, was das Debugging betrifft, wie ich finde. Da kommt nix dran. Empfehle daher das Visual Studio. Allerdings ist der Microsoft Compiler nur so lala, alelrdigns oll, wie ich gehört habe, in der neuen Version die Toolchain austauschbar sein. 😋



  • Das bringt mir leider nix.
    Wir müssen Netbeans und Cygwin Compiler für die Uni benutzen. Ich brauch das ja auch auf meinem Laptop für die Praktikas.


  • Mod

    Cabooze schrieb:

    Übrigens bringt mich das Debugger Problem langsam auf die Palme. ich weiß auch gar nich unter welchem Thema ich das hier reinschreiben müsste wenn ich ein neuen Thread aufmachen wollte.

    Wie wäre es mit "'no such file or directory' beim Debuggen mit Netbeans" im Compiler & IDE Forum?


Anmelden zum Antworten