Rekursive Funktionen
-
Simpelste Lösung:
#include <iostream> void print (char *str) { if (*str) print(str+1); std::cout << *str; } int main() { print ("hallo"); }
-
Andromeda schrieb:
Simpelste Lösung:
#include <iostream> void print (char *str) { if (*str) print(str+1); std::cout << *str; } int main() { print ("hallo"); }
C-Strings sind super
-
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.
-
DirkB schrieb:
Andromeda schrieb:
Simpelste Lösung:
#include <iostream> void print (char *str) { if (*str) print(str+1); std::cout << *str; } int main() { print ("hallo"); }
C-Strings sind super
Bei C ist alles super. Sogar das doofe, C++-mäßige *std::cout << str; kann man durch *putchar (str); ersetzen.
-
A bit of spoon feeding because it is sunday:
int main(void) { string str = "Hello World"; rek( str, static_cast<int>(str.length())-1 ); return 0; } void rek(string str, int len) { if( len >= 0 ) { cout << str.at(len); rek(str, len-1); } }
-
EOP schrieb:
A bit of spoon feeding because it is sunday:
int main(void) { string str = "Hello World"; rek( str, static_cast<int>(str.length())-1 ); return 0; } void rek(string str, int len) { if( len >= 0 ) { cout << str.at(len); rek(str, len-1); } }
static_cast ist bei richtigem Parametertyp überflüssig. Zwei Parameter statt einem == unelegant. cout in der Funktion ist ganz schlecht, weil du die Funktionalität "Ausgabe" mit der Funktionalität "String umdrehen" in eine einzige Funktion packst. Eine Funktion zum Umdrehen sollte auch in einer GUI nutzbar sein. Dies nur als "spoon feeding" für dich. Schönen Sonntag!
-
Hab das in weniger als 2 min. geschrieben - ohne Beachtung der Eleganz.
-
ohwierekursiv schrieb:
Igitt, Zeiger char*. Frei nach SeppJ :
[...]Hm, wenns hier schon ne vollständige Lösung gibt, dann hier:
std::string rueckwaerts(const std::string &str) { return str.size() < 2 ? str : rueckwaerts(str.substr(1)) + str[0]; }
So herum ists einfacher. Und man kann den Rekursionsabbruch schon bei Länge 1 machen.
-
irrsinnEOP schrieb:
cout in der Funktion ist ganz schlecht, weil du die Funktionalität "Ausgabe" mit der Funktionalität "String umdrehen" in eine einzige Funktion packst.
Die Aufgabe lautete, den String umgekehrt auszugeben.
Wenn man das machen kann, ohne den String zu verändern oder einen neuen anzulegen, hat das auch eine gewisse Eleganz.
-
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