Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » rekursiv

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 < [ 2 ]
000
17.09.2002, 14:28 Uhr
e-Caf|Y|baB



Hallo,
was heißt rekursiv in der Programmierung und was gibt es für andere "Arten"?
Danke, MfG e-Caf
--
There are 10 types of people - those who understand binary and those who
don't.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.09.2002, 14:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Rekursiv bedeutet, dass eine Funktion sich selbst aufruft, um ein Ergebnis zu liefern. zB kann man eine rekursive Funktion schreiben, um die Summe aller Zahlen von 1 bis N zu bestimmen:

C++:
unsigned summe(unsigned n)
{
    if (n>=1) return summe(n-1)+n;
    return 0;
}


Rekursionen sind manchmal sehr elegant, aber niemals notwendig: man kann jeden Algorithmus, der sich rekursive ausdrücken läßt, auch iterativ loesen.
Bei obigen Beispiel wäre das:

C++:
unsigned summe(unsigned n)
{
    unsigned s = 0;
    for(unsigned i=1; i<=n; ++i) s+=i;
    return s;
}


oder - logo:

C++:
unsigned summe(unsigned n)
{
    return  (n*(n+1))/2;
}


wobei diese Lösung für grosse N nicht tut (Overflow)
--
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
17.09.2002, 15:31 Uhr
e-Caf|Y|baB



Achso, danke, aber dürfen Funktionen sich denn selbst aufrufen? Ich dachte immer das geht nicht.
Tschüss
--
There are 10 types of people - those who understand binary and those who
don't.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.09.2002, 16:10 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
e-Caf|Y|baB postete
Achso, danke, aber dürfen Funktionen sich denn selbst aufrufen? Ich dachte immer das geht nicht.

Ich darf alles. Ich erlabe dir, es mir gleich zu tun.
--
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
004
17.09.2002, 17:38 Uhr
Christian
C/C++ Master
(Operator)


Hi virtual!

Der Ausspruch, jeder Algo, der rekursiv arbeitet, kann auch nicht rekursiv geschrieben werden leuchtet zwar ein, aber wie sieht es denn bei meiner Lösung zu dem Sonntagsrätsel mit dem Nikolaus aus?
Die Rekursivität nimmt mir doch hierbei genau das ab, was so schwer zu implementieren ist (für mich), und zwar sicherzustellen, dass alle Möglichkeiten ordentlich durchprobiert werden. Also, meine Frage, wie müsste in etwa meine Lösung aussehen, wenn ich eine rein iterative Lösung haben möchte? Auf alle Fälle bin ich der Meinung, dass die nicht iterative Lösung sicherlich weniger elegant ist und vor allem länger und komplizierter sein wird. Ich bin mal gespannt.
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.09.2002, 07:22 Uhr
virtual
Sexiest Bit alive
(Operator)


Vorweg: ich fiunde Deine Lösung da eigentlich mit die Schönste.

Generell ist an Rekursiven Lösungen ja nichts auszusetzen, sie sind oft eleganter als die nicht-rekursiven. So sehe ich das auch beim Nikolausproblem.
Eine Nichtrekursive Lösung zum Nikolausproblem kann ich mal hier kurz skizzieren (sie ist nicht schwerer zu verstehen als eine rekursive), vielleicht schiebe ich noch die konkrete Implementation nach:

Das haus besteht aus 8 Strichen, die ich mal mit den Ziffern 0 - 7 durchnummerie. Der String "01234567" Representiert also einen Weg das Haus zu zeichnen, weil alle 8 Striche genau einmal vorkommen. Ob dies eine Legale Art ist, das Haus zu zeichnen, sei dahin gestellt.
Die Toplevel schleife koennte also so aussehen:

C++:
#include <algorithm>

void gebe_alle_moeglichkeiten_aus()
{
    char striche[] = "01234567";

    do
   {
       // Mach irgendwas, siehe unten
    } while (std::next_permutation(striche, striche+8));
}



Die Schleife wird für jede denkbare Permutation - und damit pot. Möglichkeit - genau einmal durchlaufen. In der Schleife muessten nun zwei Dinge geschehen:
1. Prüfung, ob die Striche in umgekehrter Reihenfolge bereits gefunden wurden (dazu eben striche umdrehen und nachgucken, ob der resultierende String bereits in einem Ergebnisvektor vorhanden ist)
2. Prüfung, ob die Striche einen legalen Weg darstellen, das Haus zu zeichnen. Zu diesem Zweck bietet sich an, eine Matrix zu wenden, die die entsprechenden Informationen enthält. Ist es möglich, das Haus so zu zeichnen, kann der String in den Ergebnisvektor übernommen werden.
--
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
006
23.09.2002, 18:25 Uhr
~0xdeadbeef
Gast


Ich dachte, die Mathematiker streiten sich noch drum, ob alle rekursiv lösbaren Probleme auch iterativ lösbar sind. Mir ist zum Beispiel noch kein iterativer Algorithmus für den Turm von Hanoi untergekommen; Zumindest keiner, der nicht ab 10 Scheiben mehrere Universenzeitalter benötigt hätte...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.09.2002, 20:41 Uhr
Christian
C/C++ Master
(Operator)


Das interessiert mich. Erkläre bitte genauer, was es damit auf sich hat (so fern das ein noch nicht Studierter verstehen kann...) :-)

Grüße
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.09.2002, 22:21 Uhr
virtual
Sexiest Bit alive
(Operator)


Daß man einen rekursiven Algorithmus in einen iterativen umwandeln kann ist Fakt. Ich muss dir den Beweis schuldig bleiben, ich habe ihn nicht zur Hand (ich bin mir aber sicher, daß dem so ist!). Ich fände eine gegenteilige Behauptung auch sehr unlogisch: Rekursion ist je keine Magie oder so. Letztlich benutzt man Rekursion ja nur, um bestimmte Zustandsinformationen im Callstack des Rekursionsaufrufs zwischen zu speichern (beim Nikolausproblem ist das zB welche Linien bereits gezeichnet sind). Ob man nun einen Callstack verwendet oder ein Array, Stack, Liste or whatever ist ja egal.

Im Zweifel würde ich aber dennoch zur rekursion raten, wenn die Problemstellung rekursiv ist. Eine mutwillige Umformulierung in einen iterativen Algorithmus ist ohne triftigen Grund meist Mumpitz.

Angemerkt sei noch, daß ich beim Nikolausrätsel zwar eine iterative Lösung vorgestellt habe, diese entspricht aber nicht einer umformulierung des rekursiven ansatzes. Daher bietet sich dies auch nicht als Vergleich an.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.09.2002 um 22:22 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.09.2002, 00:36 Uhr
Hans
Library Walker
(Operator)



Zitat:
virtual postete
Rekursiv bedeutet, dass eine Funktion sich selbst aufruft, um ein Ergebnis zu liefern.
...
Rekursionen sind manchmal sehr elegant, aber niemals notwendig: man kann jeden Algorithmus, der sich rekursive ausdrücken läßt, auch iterativ loesen.



Schön.
Hast Du (oder irgend jemand anders) zufällig eine iterative Variante des Quicksort-algorithmus auf Lager???
(Der ist zwar gerade deshalb so schnell, weil er rekursiv arbeitet, wenn ich das richtig verstanden habe, aber das ist ja wieder ein anderes Thema.)

MfG,
Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Allgemeines (OffTopic) ]  


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: