<?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 stoppen]]></title><description><![CDATA[<p>Hallo zusammen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich soll ein Programm schreiben, das mithilfe der Bisektionsmethode die Nullstelle einer streng monoton steigenden Funktion wie folgt berechnet:<br />
1. Setzel=a und r=b.<br />
2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.<br />
3. Teste, ob r − l &lt; ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.<br />
4. Sonst teile [l, r] in der Mitte und setze das Verfahren mit beiden Teilintervallen rekursiv bei (2) fort.<br />
Das soll mit folgender signatur geschehen:<br />
void bisection(std::vector &lt;double &gt;&amp; interval , double eps);</p>
<p>Mein Versuch sieht nun so aus:</p>
<p>void Tbisection(std::vector &lt;double &gt;&amp; interval, double eps) {<br />
double l;<br />
double r;<br />
l = interval[0];<br />
r = interval[1];<br />
cout &lt;&lt; &quot;l = &quot; &lt;&lt; l &lt;&lt; endl;<br />
cout &lt;&lt; &quot;r = &quot; &lt;&lt; r &lt;&lt; endl;<br />
//cout &lt;&lt; &quot;f(l) = &quot; &lt;&lt; f(l) &lt;&lt; endl;<br />
//cout &lt;&lt; &quot;f(r) = &quot; &lt;&lt; f(r) &lt;&lt; endl;<br />
if (f(l) &lt; 0 &amp;&amp; f(r) &gt; 0) {<br />
if (r - l &lt; eps) {<br />
interval[0] = l;<br />
interval[1] = r;<br />
cout &lt;&lt; &quot;Die Nullstelle liegt im Interval: [&quot; &lt;&lt; interval[0] &lt;&lt; &quot;,&quot; &lt;&lt; interval[1] &lt;&lt; &quot;]&quot; &lt;&lt; endl;<br />
return;<br />
}<br />
else {<br />
double a = (r - l)/2;<br />
vector&lt;double&gt; inta(2);<br />
inta[0] = l + a;<br />
inta[1] = r;<br />
Tbisection(inta, eps);<br />
vector&lt;double&gt; intb(2);<br />
intb[0] = l;<br />
intb[1] = r - a;<br />
Tbisection(intb, eps);<br />
}<br />
}<br />
else {<br />
cout &lt;&lt; &quot;Das Interval enthält keine Nullstellen.&quot;;<br />
}<br />
}</p>
<p>Mein Problem ist nun, dass die Funktion das Interval zwar findet, jedoch die Berechnung nicht stoppt sondern die Rekursion weiterführt.<br />
Vielleicht kann mir jemand weiterhelfen..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317566/rekursive-funktion-stoppen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 15:27:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317566.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Jun 2013 09:51:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 09:51:16 GMT]]></title><description><![CDATA[<p>Hallo zusammen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich soll ein Programm schreiben, das mithilfe der Bisektionsmethode die Nullstelle einer streng monoton steigenden Funktion wie folgt berechnet:<br />
1. Setzel=a und r=b.<br />
2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.<br />
3. Teste, ob r − l &lt; ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.<br />
4. Sonst teile [l, r] in der Mitte und setze das Verfahren mit beiden Teilintervallen rekursiv bei (2) fort.<br />
Das soll mit folgender signatur geschehen:<br />
void bisection(std::vector &lt;double &gt;&amp; interval , double eps);</p>
<p>Mein Versuch sieht nun so aus:</p>
<p>void Tbisection(std::vector &lt;double &gt;&amp; interval, double eps) {<br />
double l;<br />
double r;<br />
l = interval[0];<br />
r = interval[1];<br />
cout &lt;&lt; &quot;l = &quot; &lt;&lt; l &lt;&lt; endl;<br />
cout &lt;&lt; &quot;r = &quot; &lt;&lt; r &lt;&lt; endl;<br />
//cout &lt;&lt; &quot;f(l) = &quot; &lt;&lt; f(l) &lt;&lt; endl;<br />
//cout &lt;&lt; &quot;f(r) = &quot; &lt;&lt; f(r) &lt;&lt; endl;<br />
if (f(l) &lt; 0 &amp;&amp; f(r) &gt; 0) {<br />
if (r - l &lt; eps) {<br />
interval[0] = l;<br />
interval[1] = r;<br />
cout &lt;&lt; &quot;Die Nullstelle liegt im Interval: [&quot; &lt;&lt; interval[0] &lt;&lt; &quot;,&quot; &lt;&lt; interval[1] &lt;&lt; &quot;]&quot; &lt;&lt; endl;<br />
return;<br />
}<br />
else {<br />
double a = (r - l)/2;<br />
vector&lt;double&gt; inta(2);<br />
inta[0] = l + a;<br />
inta[1] = r;<br />
Tbisection(inta, eps);<br />
vector&lt;double&gt; intb(2);<br />
intb[0] = l;<br />
intb[1] = r - a;<br />
Tbisection(intb, eps);<br />
}<br />
}<br />
else {<br />
cout &lt;&lt; &quot;Das Interval enthält keine Nullstellen.&quot;;<br />
}<br />
}</p>
<p>Mein Problem ist nun, dass die Funktion das Interval zwar findet, jedoch die Berechnung nicht stoppt sondern die Rekursion weiterführt.<br />
Vielleicht kann mir jemand weiterhelfen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330741</guid><dc:creator><![CDATA[chiral]]></dc:creator><pubDate>Thu, 13 Jun 2013 09:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 10:00:17 GMT]]></title><description><![CDATA[<p>Was soll der vector?</p>
<p>Zeig mal ein komplettes Minimalbeispiel. Siehe dritten Link in meiner Signatur. Der Code sieht zwar äußerst ungeschickt, aber nicht direkt falsch aus. A propos Aussehen: Benutz bitte unbedingt die Formatierungstags, wenn du hier Code postest (unter den Smileys). Es kann gut sein, dass ich gerade einen ganz einfachen Fehler übersehen habe, da der Code vollkommen unformatiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330742</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 13 Jun 2013 10:00:17 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 10:10:13 GMT]]></title><description><![CDATA[<p>Ich sehe gerade keinen Fehler aber der Code ist doch ziemlich umstaendlich. Hier eine Idee wie man das etwas eleganter implementieren kann:</p>
<pre><code class="language-cpp">void Tbisection(double left, double right, double eps)
{
  if ( f(left) &lt; 0 &amp;&amp; f(right) &gt; 0 )
  {
    if ( right - left &lt; eps )
    {
      // Intervall ausgeben
    }
    else
    {
      double middle = (left + right) / 2;
      Tbisection(left, middle, eps);
      Tbisection(middle, right, eps);
    }
  }
  else
  {
    cout &lt;&lt; &quot;Das Intervall enthaelt keine Nullstelle.&quot;;
  }
}
</code></pre>
<p>(Ungetestet und nur kurz so hingeschrieben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330744</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 13 Jun 2013 10:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 10:12:52 GMT]]></title><description><![CDATA[<p>Es wäre natürlich noch hübsch, die Funktion f nicht fest ein zu programmieren.</p>
<pre><code>void bisection(double left, double right, double eps, double (&amp;f)(double))
</code></pre>
<p>bietet sich als Signatur an. Kann man natürlich nochmal verallgemeinern mittels Templates. Aber die Funktion f flexibel zu machen ist erst einmal das wichtigste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330745</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 13 Jun 2013 10:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 10:19:15 GMT]]></title><description><![CDATA[<p>Ich hab mal den Code von icarus2 auf die eigentliche Frage angepasst.</p>
<pre><code class="language-cpp">// true zurückgeben, wenn Nullstelle gefunden
bool Tbisection(double left, double right, double eps) 
{ 
  if ( f(left) &lt; 0 &amp;&amp; f(right) &gt; 0 ) 
  { 
    if ( right - left &lt; eps ) 
    { 
      // Intervall ausgeben 
      return true;  // gefunden
    } 
    else 
    { 
      double middle = (left + right) / 2; 
      if (Tbisection(left, middle, eps))
        return true; // wurde schon gefunden, kann abbrechen
      if (Tbisection(middle, right, eps))
        return true; // wurde schon gefunden, kann abbrechen
    } 
  } 
  else 
  { 
    cout &lt;&lt; &quot;Das Intervall enthaelt keine Nullstelle.&quot;; 
  }
  return false; // schade, (noch) nichts gefunden.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2330747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330747</guid><dc:creator><![CDATA[ahnfgydt]]></dc:creator><pubDate>Thu, 13 Jun 2013 10:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 10:32:06 GMT]]></title><description><![CDATA[<p>ahnfgydt schrieb:</p>
<blockquote>
<p>Ich hab mal den Code von icarus2 auf die eigentliche Frage angepasst.</p>
</blockquote>
<p>Er will nicht wissen, ob es in einem Intervall eine Nullstelle gibt, sondern alle Nullstellen im Intervall berechnen.<br />
Fuer die Frage der Existenz einer Nullstelle in einem Intervall fuer stetige monoton wachsende Funktionen das Bisektionsverfahren anzuwenden ist onehin komplett sinnfrei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2330749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330749</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 13 Jun 2013 10:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Thu, 13 Jun 2013 11:23:40 GMT]]></title><description><![CDATA[<p>chiral schrieb:</p>
<blockquote>
<p>Hallo zusammen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich soll ein Programm schreiben, das mithilfe der Bisektionsmethode die Nullstelle einer streng monoton steigenden Funktion wie folgt berechnet:<br />
1. Setzel=a und r=b.<br />
2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.<br />
3. Teste, ob r − l &lt; ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.<br />
4. Sonst teile [l, r] in der Mitte und setze das Verfahren mit beiden Teilintervallen rekursiv bei (2) fort.<br />
Das soll mit folgender signatur geschehen:<br />
void bisection(std::vector &lt;double &gt;&amp; interval , double eps);</p>
</blockquote>
<p>Keine Chance, sinnvollen Code zu schreiben, wenn Du Dich an diese Beschreibung und Signatur halten sollst.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;iomanip&gt;
using namespace std;

double f(double x){
    return x*x-2;
}

//Erster Versuch
void bisection1(vector&lt;double&gt;&amp; interval,double eps){//seltsame schnittstelle
    if(interval[1]-interval[0]&lt;eps)
        return;
    double m=(interval[0]+interval[1])/2;
    if(f(m)&gt;0)
        interval[1]=m;
    else
        interval[0]=m;
    bisection1(interval,eps);
}

//Leider ist hier die Rekursaion völlig sinnfrei, das ist eine recht einfache Schleife
//Mal sich an den Text halten.

//Zweiter Versuch
void bisection2(vector&lt;double&gt;&amp; interval,double eps){//seltsame schnittstelle
//1. Setze l=a und r=b.
//recht sinnfrei
    double l=interval[0];
    double r=interval[1];
//2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.
//autsch, das soll die Entscheidung beim Aufruf ersetzen.
//mangels rückgabe, wird das aua machen.
    if(not(f(l)&lt;=0 and f(r)&gt;=0))
        return;
//3. Teste, ob r − l &lt; ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.
    if(r-l&lt;eps)
        return;
//4. Sonst teile [l, r] in der Mitte und setze das Verfahren mit beiden Teilintervallen
//rekursiv bei (2) fort.
    else{
        double m=(l+r)/2;
        interval[0]=l;
        interval[1]=m;
        bisection2(interval,eps);

        interval[0]=m;
        interval[1]=r;
        bisection2(interval,eps);

        //und nu, welcher Aufruf war der bessere?
    }
}
//Nee, so nicht. So ergibt das gar keinen Sinn.

//Dritter Versuch
void bisection3(vector&lt;double&gt;&amp; interval,double eps){
//1. Setzel=a und r=b.
//ok, die Schleife muss der schrägen Schnittstelle nicjht folgen.
l1:
    double l=interval[0];
    double r=interval[1];

//2. Teste, ob [l, r] eine Nullstelle entha ̈lt. Wenn nicht: Abbruch.
//ok, vorher mal testen, sonst suchen wir uns blöd.
l2:
    if(not(f(l)&lt;=0 and f(r)&gt;=0))
        return;

//3. Teste, ob r − l &lt; ε ist. Wenn ja, dann ist das Lo ̈sungsintervall gefunden.
l3:
    if(r-l&lt;eps){
        interval[0]=l;
        interval[1]=r;
        return;
    }

l4:
//4. Sonst teile [l, r] in der Mitte
    double m=(l+r)/2;
//und setze das Verfahren mit beiden Teilintervallen
//nee, nur mit dem besseren
    if(f(m)&gt;0)
        r=m;
    else
        l=m;
//rekursiv bei (2) fort.
//nee, nicht rekursiv. Und nicht bei (2), weil bei (3) ausreicht.
    goto l3;
}

int main(){
    vector&lt;double&gt; interval;
    interval.push_back(0);
    interval.push_back(10);

    bisection3(interval,0.000001);

    cout&lt;&lt;setprecision(10)&lt;&lt;interval[0]&lt;&lt;&quot; &lt;= wurzel(2) &lt;= &quot;&lt;&lt;interval[1]&lt;&lt;'\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2330756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2330756</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 13 Jun 2013 11:23:40 GMT</pubDate></item><item><title><![CDATA[Reply to rekursive Funktion stoppen on Fri, 14 Jun 2013 08:39:34 GMT]]></title><description><![CDATA[<p>Vielen vielen Dank für eure Antworten!! Ihr habt mir sehr geholfen!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2331000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2331000</guid><dc:creator><![CDATA[chiral]]></dc:creator><pubDate>Fri, 14 Jun 2013 08:39:34 GMT</pubDate></item></channel></rss>