Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rekursion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.07.2003, 19:08 Uhr
virtuel



Hi! Ich brauch schon wieder eure Hilfe, komme irgendwie nicht weiter. also:
ich habe folgende Funktion:

C++:
string ziffern (unsigned int x) {
string res = "";
while (x > 0) {
res = char ('0' + (x - (x / 10) * 10) + res;
x = x / 10 ;
}
return res ;
}



1. Wie kann ich die Funktion Ziffern rekursiv definieren?
2. Die rekursive Definition von ziffern basiert auf einer passenden Auffassung der ntürlichen Zahlen als rekursiver Menge. Wie sieht diese aus: was ist die Basis und wie werden natürliche Zahlen konstruiert, die nicht zu dieser Basis gehören?


freue mich über jede Antwort.
Gruß
v.

Dieser Post wurde am 10.07.2003 um 14:51 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.07.2003, 19:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Du Code postest, verwende bitte Code tags, macht uns die Arbeit leichter! Ich machs jetzt nochmal für Dich.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.07.2003, 20:07 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, die obige Funktion liefert einen leerstring zurück, wenn x==0 ist. ist das so gewünscht?
ansonsten wäre folgendes das (ungetestete) rekursive Äquivalent:

C++:
string ziffern(unsigned x)
{
    string res;
    if (x>10) res = ziffern(res/10);
    res += char('0'+x%10);
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2003, 20:45 Uhr
virtuel



sorry, werde demnächst Code Tags benutzen.

- bin ein wenig verwirrt, bzgl. der aufgabe, muss mal nachdenken.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.07.2003, 22:17 Uhr
ao

(Operator)


Die rekursive Idee ist, eine Zahl zu zerlegen in ihre letzte Ziffer und den Rest. Die letzte Ziffer wandelt man zu einem String (bzw. einen einzelnen Zeichen), den Rest zerlegt man wieder in letzte Ziffer und Rest.

Das setzt sich fort, bis nur noch eine einstellige Zahl bleibt; diese ist selbst ihre letzte Ziffer und der Rest ist nichts.

Also:
1.: aus 1234 wird 123 und 4. 4 umwandeln in "4", weiter mit 123.
2.: aus 123 wird 12 und 3. 3 umwandeln in "3", weiter mit 12.
3.: aus 12 wird 1 und 2. 2 umwandeln in "2", weiter mit 1.
4.: aus 1 wird Nichts und 1. 1 umwandeln in "1". Fertig.

Beim Wiederhochsteigen aus der Rekursionstiefe werden die Zeichenketten zu einer Kette zusammengefügt.

Die Arithmetik zum Zerlegen der Zahl ist einfach: Zahl % 10 liefert die letzte Stelle, Zahl / 10 den Rest (Ganzzahl-Division).

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.07.2003, 23:32 Uhr
Pablo
Supertux
(Operator)


Wichtig bei einer Rekursion ist, dass du eine Abbrechbedingung findest, d.h. eine Stelle der rekursiven Funktion findest, so dass die Funktion irgendwann stopt.
Bsp: a^b := pow(a,b)
Mathematisch ist die Potenzierung rekursiv definiert.
pow(a,b) = 1 falls b == 0
pow(a,b) = a*pow(a,b-1), sonst

In diesem Fall ist pow(a,b)=1 die Abbruchbedingung. pow(a,b-1) dekrementiert zwar b um 1 bis irgendwann b == 0, dann stop. Sagen wir mal, ich hätte aus Versehen die Abbruchbedingung vergessen. Dann würde meine Funktion eine endlos Schleife sein, also wenn du wa rekursives programmierst, immer daran denken, dass die Funktion irgendwo (oder besser gesagt, irgendwann) terminiert wird
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.07.2003, 23:51 Uhr
~0xdeadbeef
Gast


virtual, virtual, virtual - du solltest wirklich wissen, dass ans Ende einer nicht-void-Funktion ein return-statement gehört...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.07.2003, 23:56 Uhr
~0xdeadbeef
Gast


Übrigens: Für den Fall, dass du sowas jemals im wirklichen Leben brauchen solltest (will sagen, nicht als Übungsaufgabe):

C++:
#include <sstream>
#include <string>

std::string ziffern(int i) {
    std::stringstream is;
    is << i;
    return is.str();
}


Schuldigung, wollte auch mal angeben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.07.2003, 07:51 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~0xdeadbeef postete
virtual, virtual, virtual - du solltest wirklich wissen, dass ans Ende einer nicht-void-Funktion ein return-statement gehört...

Ups, Ich sollte vielleicht erstmal programmieren lernen. Sorry.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: