Rekursive Funktionen


  • Mod

    Wie übergibst du sie, wenn du nur den String als Parameter verwenden darfst? Und mit static in rekursiven Funktionen fangen wir lieber gar nicht erst an...



  • Auweia, dafür werde ich wieder Haue bekommen, funktioniert aber:

    int main(void)
    {
    string str = "Hello World!";
    	if( str.length() )
    		rek(str);
    	return 0;
    }
    
    void rek(string str)
    {
    	static size_t len = 0;
    	if( len < str.length()-1 )
    	{
    		++len;
    		rek(str);
    	}
    	cout << str.at( len-- );
    }
    

    EDIT:

    SeppJ schrieb:

    Und mit static in rekursiven Funktionen fangen wir lieber gar nicht erst an...

    Haha, zu spät. 🙂


  • Mod

    Liebe Zuschauer: Nicht Zuhause nachmachen!



  • Hahaha, hab mit schlimmeren Kommentaren gerechnet. Werden schon noch kommen. 😞
    Ich weiß nicht, was ihr alle habt, obwohl alle Bedingungen erfüllt sind.



  • EOP: Ruf einfach mal die Funktion 2x hintereinander auf...



  • Th69 schrieb:

    EOP: Ruf einfach mal die Funktion 2x hintereinander auf...

    @Th69: Wieso sollte ich?

    Hab schon hustbaer gesagt, daß ich nur für etwas Spaß und Unterhaltung sorge, damit nicht alles so dröge und todernst in diesem Forum ist.

    Wenn man nicht das Komplettwerk von Leo Tolstoi eingibt, sollte es auch klappen. Bei "Hello World!" klappt es jedenfalls.

    Ansonsten bin ich ein profi für "smashing the stack for fun and profit". Sowohl das als auch programmieren ist für mich nur noch ein Zeitvertreib mit Lustgewinn. Bin Rentner. :p



  • Dann kommentiere deine Beiträge bzw. Code als "just for fun" oder "offtopic".
    Leider ist es so, daß viele Leute einfach Code aus Foren 1:1 übernehmen, ohne den Hintergrund zu kennen (geschweige denn das gesamte Thema durchlesen)...


  • Mod

    Außerdem bin ich mir nie so sicher, ob deine vermeintlichen Scherzlösungen wirklich Scherze sind, oder du dir der Probleme und besseren Lösungen eventuell gar nicht bewusst bist. Sie sehen so aus wie schlechter Code, nicht wie Scherze. Eine Scherzlösung müsste hier mMn mindestens Template-Metaprogrammierung benutzen, um zur Compilezeit einen statischen Codepfad für alle Anfangslängen zwischen 0 und 1000 erzeugen.



  • 👍



  • Scherz hin oder her.
    Wer ausser mir hat eine Funktion geliefert, die alle Anforderungen erfüllt? Richtig - niemand.

    EDIT:
    WAS mich auch immer zum Ziel führt ist für mich in Ordnung.



  • EOP schrieb:

    Scherz hin oder her.
    Wer ausser mir hat eine Funktion geliefert, die alle Anforderungen erfüllt? Richtig - niemand.

    Soso

    EOP schrieb:

    WAS mich auch immer zum Ziel führt ist für mich in Ordnung.

    Ahja... machste auch mit ner Schrotflinte Getränkeflaschen auf?



  • DocShoe schrieb:

    Ahja... machste auch mit ner Schrotflinte Getränkeflaschen auf?

    Nö, aber mit der Tischkante oder einem zusammengefalteten Geldschein oder meinem Feuerzeug.



  • EOP schrieb:

    Scherz hin oder her.
    Wer ausser mir hat eine Funktion geliefert, die alle Anforderungen erfüllt? Richtig - niemand.

    EDIT:
    WAS mich auch immer zum Ziel führt ist für mich in Ordnung.

    Lachhaft. Wenn Du den Rat von th69 befolgt hättest, würdest du sehen, dass dein programm Schrott ist. Einfach mal

    if( str.length() )
            rek(str);
    

    zusätzlich in dein main() einfügen, um deine geniale Funktion zweimal aufzurufen.



  • EOSchrott schrieb:

    Lachhaft. Wenn Du den Rat von th69 befolgt hättest, würdest du sehen, dass dein programm Schrott ist. Einfach mal

    if( str.length() )
            rek(str);
    

    zusätzlich in dein main() einfügen, um deine geniale Funktion zweimal aufzurufen.

    Normalerweise beantworte ich keine posts von unregistrierten Gestalten, aber machen wir mal eine Ausnahme, du kleiner Dummkopf:
    Diese Funktion ist weder dafür entworfen noch dafür gedacht, sie mehrfach hintereinander aufzurufen. Rekursiv funktioniert sie.
    Liefere was Besseres ab. Bis dahin alles Gute für dich.



  • Anscheinend haben alle mögliche Leute Spaß an EOP-bashing. Seis drum.
    Liefert erstmal ein Programm, das die beiden Anforderungen erfüllt. Danach reden wir weiter.
    - rekursiv
    - nur der string soll übergeben werden

    Und jetzt macht mal ihr superschlauen Helden. Freue ich schon auf alle Antworten.


  • Mod

    Ich weiß wirklich nicht, ob Troll oder tatsächlich dumm. Die allererste Antwort im Thread liefert eine genaue Bauanleitung für solch ein Programm. Das ist eine Aufgabe, die blutige Anfänger beantworten sollen und können. Kein Grund, andere Leute Dummköpfe zu nennen, wenn sie deine Schrottprogramme (oder "Scherzprogramme", wie du sie nennst) als solche zerreißen.



  • SeppJ schrieb:

    Eine viel einfachere, rekursive Definition einer umgedrehten Zeichenfolge ist: Eine umgedrehte Zeichenfolge ist leer, falls das Original leer ist. Ansonsten ist sie das letzte Zeichen der Originalfolge plus die Umdrehung aller Zeichen der Originalfolge vor dem letzten Zeichen.

    Wie du siehst, muss da nirgendwo gezählt werden, alles geht über Zeichenfolgen und ihre Längen.

    Bei allem Respekt für dich, SeppJ - zeige es mir.
    Und Dummköpfe benamse ich solange als Dummköpfe bis das Gegenteil bewiesen ist.

    Weshalb gibt es denn das Sprachkonstrukt der lokalen static Variablen?
    Ich weiß zumindest wie man es konstruktiv, zur Freude aller Beteiligten und gut für 2-3 Seiten Kommentare einsetzt.

    Wenn ich dran erinnern darf:

    EOP schrieb:

    Zur Not benutze ich eine fiese lokale static Variable.

    Wie es scheint bin ich mir also durchaus bewusst, was ich mache.



  • EOP schrieb:

    SeppJ schrieb:

    Eine viel einfachere, rekursive Definition einer umgedrehten Zeichenfolge ist: Eine umgedrehte Zeichenfolge ist leer, falls das Original leer ist. Ansonsten ist sie das letzte Zeichen der Originalfolge plus die Umdrehung aller Zeichen der Originalfolge vor dem letzten Zeichen.

    Bei allem Respekt für dich, SeppJ - zeige es mir.

    Ich will ja jetzt nicht auch noch auf dich einhauen, aber das ist doch jetzt echt blöd.

    std::string rek(const std::string& s)
    {
        // Eine umgedrehte Zeichenfolge ist leer, falls das Original leer ist.
        if(s.length() == 0)
            return "";
        // Ansonsten ist sie das letzte Zeichen der Originalfolge
        std::string a {s.at(s.length()-1)};  //substr oder sowas nicht erlaubt
        // plus die Umdrehung aller Zeichen der Originalfolge vor dem letzten Zeichen.
        std::string b {s, 0, s.length()-1};  //substr oder sowas nicht erlaubt
        return a + rek(b);
    }
    

  • Mod

    EOP schrieb:

    Und Dummköpfe benamse ich solange als Dummköpfe bis das Gegenteil bewiesen ist.

    Dann bist du jetzt ganz offiziell der Forenclown, bis zum Beweis des Gegenteils.



  • Hier noch eine Version in einer funktionalen Sprache (das ja keine [globalen] Variablen kennt) - denn das ist nun wirklich ein Allerweltsproblem:

    rev xs = if null xs then xs else rev (tail xs) ++ [head xs]
    

    oder mittels pattern matching

    rev [] = []
    rev (x:xs) = rev xs ++ [x]
    

    (hier mittels Haskell)

    @EOP: Und Jockelx hat dies eben 1:1 nach C++ übersetzt - ganz easy!


Anmelden zum Antworten