<?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[Rekursive Funktion klappt nicht!]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines C++ programm geschrieben welches als Ergebnis<br />
die Fakultät berechnen soll, es funktioniert nur nicht wie erwartet.<br />
Als Ergebnis erhalte ich in jedem Fall Null.</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;

using namespace std ;

long fakultaet (unsigned long n) {
     if (n==0) return 1 ;
     else {
          cout &lt;&lt; n;
          return n*fakultaet(--n);
     }
}

int main () {
unsigned long n=0;
cout &lt;&lt; &quot;Berechnung der Fakultät \n\n&quot; ;
cout &lt;&lt; &quot;Bitte eine Zahl eingeben : &quot; ;
cin &gt;&gt; n ;
cout &lt;&lt; &quot;Ergebnis : &quot; &lt;&lt; fakultaet(n);

cin &gt;&gt; n;

return 0;
}
</code></pre>
<p>Ich bin jetzt dahinter gekommen das es an dem Dekrementoperator liegen muss,<br />
denn wenn ich es abändere zu</p>
<pre><code class="language-cpp">return n*fakultaet(n-1);
</code></pre>
<p>funktioniert es einwandfrei.</p>
<p>Ich weiß das --n den Wert von n um 1 erniedrigt soweit ist es äquivalent mit der zweiten Möglichkeit. Der Unterschied besteht jetzt jedoch darin das dieser<br />
Wert in der lokalen Variable n gespeichert wird. Dieser gespeicherte Wert der<br />
jetzt nach Dekrementierung in n enthalten ist, wird doch als Parameter beim<br />
nächsten Aufruf der Funktion fakulteat betrachtet.</p>
<p>Wo ist mein Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301185/rekursive-funktion-klappt-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 04:47:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301185.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Mar 2012 12:45:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Wed, 21 Mar 2012 12:45:25 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines C++ programm geschrieben welches als Ergebnis<br />
die Fakultät berechnen soll, es funktioniert nur nicht wie erwartet.<br />
Als Ergebnis erhalte ich in jedem Fall Null.</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;

using namespace std ;

long fakultaet (unsigned long n) {
     if (n==0) return 1 ;
     else {
          cout &lt;&lt; n;
          return n*fakultaet(--n);
     }
}

int main () {
unsigned long n=0;
cout &lt;&lt; &quot;Berechnung der Fakultät \n\n&quot; ;
cout &lt;&lt; &quot;Bitte eine Zahl eingeben : &quot; ;
cin &gt;&gt; n ;
cout &lt;&lt; &quot;Ergebnis : &quot; &lt;&lt; fakultaet(n);

cin &gt;&gt; n;

return 0;
}
</code></pre>
<p>Ich bin jetzt dahinter gekommen das es an dem Dekrementoperator liegen muss,<br />
denn wenn ich es abändere zu</p>
<pre><code class="language-cpp">return n*fakultaet(n-1);
</code></pre>
<p>funktioniert es einwandfrei.</p>
<p>Ich weiß das --n den Wert von n um 1 erniedrigt soweit ist es äquivalent mit der zweiten Möglichkeit. Der Unterschied besteht jetzt jedoch darin das dieser<br />
Wert in der lokalen Variable n gespeichert wird. Dieser gespeicherte Wert der<br />
jetzt nach Dekrementierung in n enthalten ist, wird doch als Parameter beim<br />
nächsten Aufruf der Funktion fakulteat betrachtet.</p>
<p>Wo ist mein Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193621</guid><dc:creator><![CDATA[dummyjooooooooo]]></dc:creator><pubDate>Wed, 21 Mar 2012 12:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Wed, 21 Mar 2012 12:49:05 GMT]]></title><description><![CDATA[<p>1. Der Titel stimmt ja mal überhaupt nicht mit dem Problem überein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
2. Es ist nicht definiert, wann der Wert von n evaluiert wird:</p>
<pre><code class="language-cpp">n * fakultaet(--n);
// 1               2
</code></pre>
<p>Es gibt keine Definition darüber, wann der Wert von 1 oder 2 evaluiert wird. In deinem Fall wurde wohl der Wert von 1 erst nach dem Wert von 2 evaluiert, wodurch 0 herauskam.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193626</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 21 Mar 2012 12:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Wed, 21 Mar 2012 14:34:37 GMT]]></title><description><![CDATA[<p>Meinst du das es mit der Evaluierung an der Assoziativtät des Operanden<br />
liegen kann, ich hab die Faktoren einfach mal getauscht und der Fehler bleibt<br />
trotzdem. Heißt für mich das dies nichts mit dem Problem gemein hat.</p>
<p>Es muss folglich an der Definition von Prä- und Postfixschreibweise liegen die<br />
in diesem Falle nicht eindeutig geklärt ist.<br />
Nur bleibt für mich unverständlich warum es bei den vielen Verbesserungen und Versionen von C(ANSI C,C99) und C++ bei soetwas primitivem keine genaue Definition gibt.</p>
<p>Werde ich mir irgendwo aufschreiben damit ich mir es merke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193697</guid><dc:creator><![CDATA[dummyjooooooo]]></dc:creator><pubDate>Wed, 21 Mar 2012 14:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Wed, 21 Mar 2012 15:28:49 GMT]]></title><description><![CDATA[<p>Nein es geht darum, wann der Faktor n am Anfang ausgewertet wird. Das kann passieren vor oder nach dem Dekrement. Das ist nicht definiert und dem Kompiler überlassen.</p>
<p>Ein Faktor weiter vorne wird nicht immer auch vor den anderen evaluiert. Wenn du folgende Rechnung hast:<br />
<code>x = a * b * c * d;</code><br />
Dann kann womöglich zuerst d, dann b, dann c und dann erst a evaluiert werden. Die Reihenfolge ist völlig dem Kompiler überlassen.</p>
<p>Genau das passiert bei dir. Weil es nicht definiert ist, macht dein Kompiler halt das folgende. Er wertet zuerst --n (wenn n 1, dann ist n nun 0) aus, ruft dann womöglich die Funktion auf und führt dann erst die Multiplikation durch, wo er nun n (ist nun 0) aus dem Speicher liest.</p>
<p>Die Reihenfolge der Auswertung der Operanden ist nicht definiert.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193726</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 21 Mar 2012 15:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Wed, 21 Mar 2012 15:48:53 GMT]]></title><description><![CDATA[<p>dummyjooooooo schrieb:</p>
<blockquote>
<p>Nur bleibt für mich unverständlich warum es bei den vielen Verbesserungen und Versionen von C(ANSI C,C99) und C++ bei soetwas primitivem keine genaue Definition gibt.</p>
</blockquote>
<p><a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html" rel="nofollow">http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193730</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Mar 2012 15:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Funktion klappt nicht! on Thu, 22 Mar 2012 13:58:48 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Die Reihenfolge der Auswertung der Operanden ist nicht definiert.</p>
</blockquote>
<p>Einen kleinen Nachtrag meinerseits sei erlaubt. Das ist leider immer noch das Fiese an C/C++. Trotz &gt;25 Jahren Erfahrung habe ich das Problem auch nicht sofort gesehen.</p>
<p>Merke, wenn Du einen Post- oder Preinkrement- bzw. -dekrementoperator in einem Ausdruck verwendest, sollte dessen Operand <strong>kein zweites mal</strong> im Ausdruck verwendet werden.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194160</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 22 Mar 2012 13:58:48 GMT</pubDate></item></channel></rss>