Suche Hilfe: Rekursions (einfacher Code)



  • Hi und Hallo,

    ich möchte zum Üben ein GUI-Programm schreiben, das mir, auf Knopfdruck, rekursiv Zahlen zwischen zwei Grenzen addiert.

    Beispiel:

    VON: 0 BIS: 100

    ERGEBNIS: XXX

    Habs mal versucht zu Programmieren, aber ich bekomme die Fehlermeldung das meine Variablen einen Wert haben der nie verändert wird.

    Hier mein Code:

    void __fastcall TfrmRekur::btnKlickClick(TObject *Sender)
    {
    int von = StrToInt(frmRekur->edtVon->Text);
    int bis = StrToInt(frmRekur->edtBis->Text);
    int ergebnis;
    
    int Rechnung(int bis)
    {
    if (bis == von)
      {
        return 1;
      } else
       return ergebnis = von + Rechnung(bis-1);
    
    }
    
    frmRekur->edtErg->Text = ergebnis;
    
    }
    

    Die Idee dainter ist, das das Programm solange sich selber aufruft und die obere Grenze um 1 verringert bis es bei "von" angekommen ist....und natürlich alles addiert.

    Wo liegt mein Fehler und vll noch warum? 😕

    Würde mich über eure Hilfe sehr freuen.

    MfG 🙂



  • hmm jo stimmt ja auch ... du übergibst den Wert ...

    int calc(const int& to, const int& from)
    {
        if (to == from)
            return 1;
       return (from + calc(to - 1));
    }
    
    void __fastcall TfrmRekur::btnKlickClick(TObject *Sender)
    {
        frmRekur->edtErg->Text = calc(StrToInt(frmRekur->edtBis->Text), StrToInt(frmRekur->edtVon->Text));
    }
    

    ? So oder wie willst de es haben? Hab den Sinn deiner Funktion nicht überprüft aber so sollte das gehen.



  • erstmal Danke für due schnelle Antwort.

    In Zeile 5 kommt der Fehler das zu wenig parameter übergeben werden.
    Hab sie testweise bischen abgeändert

    return (from + calc(to - 1));
    

    auf

    return (from + calc(to - 1, from - 0));
    

    Dann gehts und es wird ja duch - 0 nichts verändert.

    Das Programm lässt sich nun compilieren, aber bringt noch nicht den gewünschten Effekt.

    Werde es mal weiter probieren.
    Falls jemand die Lösung kennt, darf er sie gerne posten 😉

    P.S.
    Ist es zwingend notwendig hier mit Referenzen zu arbeiten?
    kann man nicht nur ads fertig Ergebnis zurück schicken? Dann wäre es ja wieder ein Wert und das kann eine Funktion ja verarbeiten!?



  • eaglestar schrieb:

    [...]Ist es zwingend notwendig hier mit Referenzen zu arbeiten?
    kann man nicht nur ads fertig Ergebnis zurück schicken? Dann wäre es ja wieder ein Wert und das kann eine Funktion ja verarbeiten!?

    Sehe ich auch so!
    Die vielen Funktionsaufrufe bei Rekursionen sind unnötig bzw. sogar überflüssig.

    PS:
    Ehe du eine Schleife programmierst, welche nur alle Zahlen addiert:
    Gauß hat ein schönes Verfahren zum finden der Summe ( in dem fall die Partzialsumme ( sn ) der Zahlenfolge an=n ) zwischen 0 und einer bestimmten Zahl entwickelt:

    Zahl = n
    Summe = (n + 1) * (n / 2)

    Beispiel:
    Zahl = 100
    Summe = 101 * 50 = 5050

    Hoffe ich konnte helfen!



  • Das man das vll mit einer andren Methode "schöner" Lösen kann, kann schon gut sein. Dabiete die mathematik ja unendlich viele Möglichkeinten.

    Ich das Programm soll nur zum Über der Rekursion dienen.

    Zur Funktionsweise was das Prog machen soll

    Benutzer gibt ein..

    ADDIERE

    Von: 1
    Bis: 3

    Button: Klick

    Ergebnis: 6 //also 1+2+3 oder halt 3+2+1



  • int vonbis(int von, int bis) {
        assert(bis >= von);
        if(von == bis) {
            return von;
        } else {
            return bis + vonbis(von, bis - 1);
        }
    }
    

Anmelden zum Antworten