Rekursive Funktionen
-
ohwierekursiv schrieb:
Igitt, Zeiger char*. Frei nach SeppJ :
#include <string> std::string f2(const std::string& str) { if (str.length() == 0) { return str; } else { return str.substr(str.length()-1) // letztes Zeichen als String + f2(str.substr(0, str.length()-1)); // der umgedrehte Rest } } int main() { std::cout << f2("Hallo") << '\n'; }
scheint mir angemessener zu sein in Bezug auf die Aufgabenstellung.
So gehts auch, ohne Zeiger:
#include <iostream> #include <string> using namespace std; void print (string s) { char c = s[0]; if (s.length()) print(s.erase(0,1)); cout << c; } int main() { print ("hello"); }
-
Ich hätte das wahrscheinlich auch eleganter hingekriegt, aber die Aufgabe war, das rekursiv zu lösen und ich hatte nach 4 Flaschen Merlot nicht mehr soviel Enthusiasmsus.
EDIT:
einzwei 's' vergessen
-
Boah, EOP, halt doch einfach mal die Klappe. Du kommst regelmäßig mit tdwtf-Code an und hast auch immer die selben Rechtfertigungen. Am armseligsten ist dein Code zur Stellenwertsystemumrechnung, den du regelmäßig unverändert wieder auskramst und haue dafür bekommst.
Wie zum Teufel soll bei Lehrern mit Aufgaben wie der des OPs jemals jemand anständig C++ lernen? Und dann verirrt sich ein "glückliches" Opfer glücklicherweise ins richtige(tm) Forum und was bekommt es vorgesetzt? Gequirlte kacke. toll.
</rant>
// ps: und sauf ned so fü!!
-
Swordfish schrieb:
Boah, EOP, halt doch einfach mal die Klappe. Du kommst regelmäßig mit tdwtf-Code an und hast auch immer die selben Rechtfertigungen. Am armseligsten ist dein Code zur Stellenwertsystemumrechnung, den du regelmäßig unverändert wieder auskramst und haue dafür bekommst.
Wie zum Teufel soll bei Lehrern mit Aufgaben wie der des OPs jemals jemand anständig C++ lernen? Und dann verirrt sich ein "glückliches" Opfer glücklicherweise ins richtige(tm) Forum und was bekommt es vorgesetzt? Gequirlte kacke. toll.
</rant>
// ps: und sauf ned so fü!!
Für 2 min und 4 Fl. Merlot ist das ein 1A Programm, mein Lieber.
Das mit dem tdwtf-Code werde ich mir überlegen.
Das mit dem Trinken auch falls und sobald ich aus Indien zurückkehre (kann ein bißchen dauern zu eurer Freude).EDIT:
Sind wir heute ein bißchen schlecht drauf?EDIT#2:
Was meinst du mit Stellenwertsystemumrechnung? Link bitte.
Das ist Alles nicht uverändert - ich bin einfach nur ein Fan von bit shifting.
Ich hab nie behauptet irgendjemand tolles C++ beibringen zu wollen.
Ich schreibe nur kurze, knappe und funktionierende Programme. Q&D und das wars.
-
Swordfish schrieb:
Schön wie wieder mal eine sinnfreie Aufgabe Forenseiten füllt
Hat hier jemand was von sinnfreiem Füllen gesagt?
Ich hätte da noch eine Divide-and-Conquer-Variante anzubieten mit lediglich logarithmischer Rekursionstiefe bezogen auf die Stringlänge:std::string reverse(std::string s) { if (s.length() > 1) return reverse(s.substr(s.length() / 2)) + reverse(s.substr(0, s.length() / 2)); else return s; }
... da hier ohnehin schon Komplettlösungen gepostet werden :p
SCNR,
Finnegan
-
Es geht auch rekursiv in-place:
#include <string> #include <algorithm> using namespace std; void recurse_reverse_string( string& Text, string::size_type Left, string::size_type Right ) { if( Left < Right ) { swap( Text[Left], Text[Right] ); recurse_reverse_string( Text, Left +1, Right -1 ); } } string reverse_string( string Text ) { if( Text.empty() ) return Text; else return recurse_reverse_string( Text, 0, Text.size() -1 ); }
-
Vielen Dank für eure Hilfe! Ich hätte erwähnen sollen, dass ich erst seit 2 Monaten mein Studium begonnen habe und es die ersten Funktions-Übungen waren, jedoch bin ich trotzdem nicht auf die Lösung gekommen, denn ich darf nur einen string wert übergeben und muss einen (den umgedrehten) retournieren, dabei darf ich bei string nur die 2 Methoden x.at() und x.length() verwenden. Ich komme durch alle meine Lösungsansätze nicht zur Lösung da ich entweder weitere Werte übergen + globale Variablen erstellen muss. Ich werde weiterhin an der Lösung arbeiten, aber vielen Dank für die vielen Bemühungen mir zu helfen! Für weitere Vorschläge wäre ich weiterhin dankbar!
-
Lösungen mit at und length haben wir doch jetzt in 10 verschiedenen Varianten vorgemacht. Ob man das letzte Zeichen nun mit back, length, size oder was weiß ich was holt, ist doch kein wesentlicher Unterschied.
-
newprogrammer1996 schrieb:
Vielen Dank für eure Hilfe! Ich hätte erwähnen sollen, dass ich erst seit 2 Monaten mein Studium begonnen habe und es die ersten Funktions-Übungen waren, jedoch bin ich trotzdem nicht auf die Lösung gekommen, denn ich darf nur einen string wert übergeben und muss einen (den umgedrehten) retournieren, dabei darf ich bei string nur die 2 Methoden x.at() und x.length() verwenden. Ich komme durch alle meine Lösungsansätze nicht zur Lösung da ich entweder weitere Werte übergen + globale Variablen erstellen muss. Ich werde weiterhin an der Lösung arbeiten, aber vielen Dank für die vielen Bemühungen mir zu helfen! Für weitere Vorschläge wäre ich weiterhin dankbar!
Was denn nu? Du darfst keine Schleifen benutzen und nur Funktionen, die max. den string als Parameter besitzen dürfen? Würd´ gern die Aufgabenstellung lesen, da stimmt mit Sicherheit iwas nicht.
-
DocShoe schrieb:
Was denn nu? Du darfst keine Schleifen benutzen und nur Funktionen, die max. den string als Parameter besitzen dürfen? Würd´ gern die Aufgabenstellung lesen, da stimmt mit Sicherheit iwas nicht.
Wieso? Das Problem soll eben mit Rekursion gelöst werden und das ist auch problemlos möglich. Wobei at und length alleine nicht reichen; wenn man nur at und length hat ohne Iterationszähler, braucht man mindestens noch den String-Konstruktor oder substr oder etwas vergleichbares. Vermutlich wurde der String-Konstruktor nicht explizit erwähnt.
-
SeppJ schrieb:
Das Problem soll eben mit Rekursion gelöst werden und das ist auch problemlos möglich. Wobei at und length alleine nicht reichen; wenn man nur at und length hat ohne Iterationszähler, braucht man mindestens noch den String-Konstruktor oder substr oder etwas vergleichbares. Vermutlich wurde der String-Konstruktor nicht explizit erwähnt.
Hab ich nicht demonstriert wie das rekursiv geht?
Auch wenn sich manche darüber mokiert haben. :p
-
EOP schrieb:
SeppJ schrieb:
Das Problem soll eben mit Rekursion gelöst werden und das ist auch problemlos möglich. Wobei at und length alleine nicht reichen; wenn man nur at und length hat ohne Iterationszähler, braucht man mindestens noch den String-Konstruktor oder substr oder etwas vergleichbares. Vermutlich wurde der String-Konstruktor nicht explizit erwähnt.
Hab ich nicht demonstriert wie das rekursiv geht?
Auch wenn sich manche darüber mokiert haben. :pDeins hat einen zusätzlichen Parameter, der hier nicht erlaubt ist. Wie es ohne geht, steht in der allerersten Antwort im Thread. Irgendwie ist es mir rätselhaft, wie ein Thread zu solch einer einfachen Aufgabe, die zudem in der ersten Antwort komplett gelöst wurde, derart lang werden kann
-
SeppJ schrieb:
Deins hat einen zusätzlichen Parameter, der hier nicht erlaubt ist. Wie es ohne geht, steht in der allerersten Antwort im Thread. Irgendwie ist es mir rätselhaft, wie ein Thread zu solch einer einfachen Aufgabe, die zudem in der ersten Antwort komplett gelöst wurde, derart lang werden kann
Na dann übergebe und zähle ich eben str.length() runter oder rauf. Wobei rauf mit size_t wohl praktikabler wäre und man die Ausgabe erst auf dem "Nachhauseweg" macht. Zur Not benutze ich eine fiese lokale static Variable.
-
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.
-
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)...