<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zu Rekursiven Funktionen!]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich bin gerade mal nen bissel dabei mich mit rekursiven Funktionen auseinander zusetzen. Da hab ich nen bissel in alten Tutorials rumgekrammt und bin bei Arnold W. hängen geblieben und zwar bei dem Beispiel mit dem Binärbaum.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.willemer.de/informatik/cpp/rekursion.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/rekursion.htm</a></p>
<p>Ich denke das ich verstehe wie so der Ablauf ist von einer Rekursion, aber diese Funktion verstehe ich nicht:</p>
<pre><code class="language-cpp">void ZeigeBaum(tBaum *Blatt)
{
    if (Blatt==0) return;
    ZeigeBaum(Blatt-&gt;links);            // Marke 1
    cout &lt;&lt; Blatt-&gt;Inhalt &lt;&lt; endl;
    ZeigeBaum(Blatt-&gt;rechts);           // Marke 2
}
</code></pre>
<p>Man ruft die Funktion am besten mit den ersten Eintrag auf, wenn das Blatt nicht leer sein sollte, ruft sich die Funktion erneut auf nur das es nun das naechste linke Blatt als Parameter hat usw.. Sollte das nächste Blatt irgendwann mal Null sein wird das letzte Ereignis vom stack genommen und das letzte linke Blatt angezeigt und dann mit dem rechten blatt weiter gemacht, da wird wieder zu erst nach dem linken Blatt gefragt uns. Aber wenn man im stack wieder zurueck geht muesste das doch in einer endlosschleife enden da ja nun irgendwann wieder das zuvor schon ausgegebene linke Blatt wieder da ist.</p>
<p>Koennte das evtl. mir noch mal jemand erklren wie des so ablaeuft?</p>
<p>Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203545/frage-zu-rekursiven-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 18:05:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203545.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jan 2008 19:04:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 19:04:08 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich bin gerade mal nen bissel dabei mich mit rekursiven Funktionen auseinander zusetzen. Da hab ich nen bissel in alten Tutorials rumgekrammt und bin bei Arnold W. hängen geblieben und zwar bei dem Beispiel mit dem Binärbaum.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.willemer.de/informatik/cpp/rekursion.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/rekursion.htm</a></p>
<p>Ich denke das ich verstehe wie so der Ablauf ist von einer Rekursion, aber diese Funktion verstehe ich nicht:</p>
<pre><code class="language-cpp">void ZeigeBaum(tBaum *Blatt)
{
    if (Blatt==0) return;
    ZeigeBaum(Blatt-&gt;links);            // Marke 1
    cout &lt;&lt; Blatt-&gt;Inhalt &lt;&lt; endl;
    ZeigeBaum(Blatt-&gt;rechts);           // Marke 2
}
</code></pre>
<p>Man ruft die Funktion am besten mit den ersten Eintrag auf, wenn das Blatt nicht leer sein sollte, ruft sich die Funktion erneut auf nur das es nun das naechste linke Blatt als Parameter hat usw.. Sollte das nächste Blatt irgendwann mal Null sein wird das letzte Ereignis vom stack genommen und das letzte linke Blatt angezeigt und dann mit dem rechten blatt weiter gemacht, da wird wieder zu erst nach dem linken Blatt gefragt uns. Aber wenn man im stack wieder zurueck geht muesste das doch in einer endlosschleife enden da ja nun irgendwann wieder das zuvor schon ausgegebene linke Blatt wieder da ist.</p>
<p>Koennte das evtl. mir noch mal jemand erklren wie des so ablaeuft?</p>
<p>Gruß Tobi.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442269</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Wed, 23 Jan 2008 19:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 19:38:59 GMT]]></title><description><![CDATA[<p>Die Funktion ruft sich zwar ggf. erneut auf, aber nicht mit dem selben Element. Die Funktionsausführung fängt auch nicht magischerweise von vorne an wenn der Selbstaufruf zurückkehrt bloß weil es sich um eine Rekursion handelt.</p>
<p>(Überleg dir mal wie es aussähe wenn an den Marken eins und zwei <em>foo</em> und <em>bar</em> statt <em>ZeigeBaum</em> aufgerufen würden -- <em>Blatt</em> nicht null; Aufruf <em>foo</em> mit <em>Blatt-&gt;links</em>; <em>foo</em> kehrt zurück; Inhalt ausgeben; Aufruf <em>bar</em> mit <em>Blatt-&gt;rechts</em>; <em>bar</em> kehrt zurück; <em><em><em>ZeigeBaum</em> für diesen <em>tBaum</em></em> abgehandelt!</em><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /></p>
<p>Außerdem:</p>
<p>T0bi schrieb:</p>
<blockquote>
<p>Man ruft die Funktion am besten mit den ersten Eintrag auf</p>
</blockquote>
<p>Das ist so schlicht nicht richtig. Man ruft die Funktion am besten mit dem Baum auf den man gerade betrachten möchte, auch wenn dies wohl tatsächlich oft der erste Eintrag, die &quot;Wurzel&quot; sein wird.</p>
<p>Das ist ja das tolle an rekursiven Datenstrukturen. (Wobei sich das &quot;rekursiv&quot; hier nicht auf die Funktion bezieht, sondern das heißt <strong>die Elemente eines Baumes sind Bäume</strong>.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442300</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 23 Jan 2008 19:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 20:19:15 GMT]]></title><description><![CDATA[<p>ZeigeBaum(Blatt-&gt;links);<br />
cout &lt;&lt; Blatt-&gt;Inhalt &lt;&lt; endl;<br />
ZeigeBaum(Blatt-&gt;rechts);</p>
<p>die stelle versteh ich trotzdem niht wirklich. fuer mich wuerde die funktion niemals das count geschweige denn den zweiten aufruf von ZeigeBaum erreichen, weil sie sich davor immer wieder neu aufruft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442335</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Wed, 23 Jan 2008 20:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 20:29:54 GMT]]></title><description><![CDATA[<p>Du übergibst ihr das Erste Blatt.<br />
Davon wird dann das Erste Blatt genommen, das nach links abzweigt und nochmals an de Funktion übergeben...<br />
Dadurch wird die Funktion sozusagen mit einem neuen Stammblatt aufgerufen. Erst wenn das linke blatt 0 Zurückgibt, wird zurückgekehrt und das Rechte durchlaufen, bis auch das Nullzurückgibt.. ist die Linke Seite des Stammblattes abgearbeitet, wird das selbe prozedere nocheinmal mit rechts ausgeführt. Dann kehrt die FUnktion ganz zurück.</p>
<p>Schau dir die FUnktion nochmal genau an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442344</guid><dc:creator><![CDATA[makkurona]]></dc:creator><pubDate>Wed, 23 Jan 2008 20:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 20:37:44 GMT]]></title><description><![CDATA[<p>Vielleicht sollte an der Stelle mal gesagt werden dass <strong>Blätter</strong> diejenigen Knoten sind, die keine Nachfolger haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442353</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 23 Jan 2008 20:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 20:39:48 GMT]]></title><description><![CDATA[<p>T0bi schrieb:</p>
<blockquote>
<p>ZeigeBaum(Blatt-&gt;links);<br />
cout &lt;&lt; Blatt-&gt;Inhalt &lt;&lt; endl;<br />
ZeigeBaum(Blatt-&gt;rechts);</p>
<p>die stelle versteh ich trotzdem niht wirklich. fuer mich wuerde die funktion niemals das count geschweige denn den zweiten aufruf von ZeigeBaum erreichen, weil sie sich davor immer wieder neu aufruft...</p>
</blockquote>
<p>Hast du meinen Post überhaupt gelesen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442354</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 23 Jan 2008 20:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 20:59:28 GMT]]></title><description><![CDATA[<p>Ich habe drauf geantwortet.</p>
<p>Wenn Null zurückgegeben wird, wenn also Blatt-&gt;Links nicht vorhonden ist, wird zurückgekehrt in die Schleife die aufgerufen hat.</p>
<p>Du hast mich wohl nur missverstanden.</p>
<p>Edit: Kleiner Rechtschreibfehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442371</guid><dc:creator><![CDATA[makkurona]]></dc:creator><pubDate>Wed, 23 Jan 2008 20:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Rekursiven Funktionen! on Wed, 23 Jan 2008 21:29:25 GMT]]></title><description><![CDATA[<p>nehmen wir mal einen einfachen Baum</p>
<pre><code>A
 B   C
D E F G
</code></pre>
<p>A hat die &quot;Blätter&quot; B und C<br />
B hat die Blätter D und E<br />
C hat die Blätter F und G</p>
<p>und jetzt spiel die Funktion mal in Gedanken durch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442402</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Wed, 23 Jan 2008 21:29:25 GMT</pubDate></item></channel></rss>