<?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 Fkt. läuft nicht wie gewollt]]></title><description><![CDATA[<p>Guten Tag</p>
<p>hab angefangen mich in c++ einzulesen, hab also so gut wie keine erfahrung von daher entschuldige ich mich falls dies ein zu triviales Problem ist.</p>
<p>Ich versuche in eine Datei Zeile für Zeile alle möglichen Folgen der Zahlen 0 und 1 der Länge n zu schreiben.</p>
<p>Hab hier erstmal n=3 gesetzt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;fstream&gt;

using namespace std;

int n=3;
int t=1;
int s=1;
int *I = new int[n];
int forfkt(int);

int main()
{
	ifstream file(&quot;Indikatorfolge.txt&quot;);
		if(file.is_open())
		{
		remove(&quot;Indikatorfolge.txt&quot;);
		}

	forfkt(t);
}

int forfkt(int t)
{
	std::ofstream ofs(&quot;Indikatorfolge.txt&quot;, std::ios::app);

	for(I[t]=1; I[t]&gt;=0; I[t]--)
	{
		if(t&lt;n)
		{
			t++;
		    forfkt(t);
		}
		else
		{
			for(s=1; s&lt;=n; s++)
			{
		    ofs &lt;&lt; I[s] ;
			}
			ofs &lt;&lt; std::endl;
		}

	}

};
</code></pre>
<p>Als Ausgabe bekomme ich:<br />
111<br />
110<br />
101<br />
100</p>
<p>Dies ist zwar schon schön, aber leider fehlen alle Kombinationen bei denen eine 0 vorne steht.</p>
<p>Falls jemand eine simplere Methode hat wäre ich natürlich auch dafür dankbar,<br />
jedoch würde ich auch gern verstehen warum die Rekursion nur den Fall I[1]=1 durchläuft denn wenn ich es ohne Rekursion schreibe funktioniert es:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;fstream&gt;

using namespace std;

int n=3;
//t=1;
int *I = new int[n];

int main()
{
	ifstream file(&quot;Indikatorfolge.txt&quot;);
		if(file.is_open())
		{
		remove(&quot;Indikatorfolge.txt&quot;);
		}

	std::ofstream ofs(&quot;Indikatorfolge.txt&quot;, std::ios::app);

	for(I[1]=1; I[1]&gt;=0; I[1]--)
	{

		for(I[2]=1; I[2]&gt;=0; I[2]--)
		{

			for(I[3]=1; I[3]&gt;=0; I[3]--)
			{
				ofs &lt;&lt; I[1] &lt;&lt; I[2] &lt;&lt; I[3] &lt;&lt; std::endl;
			}
		}
	}
}
</code></pre>
<p>Schonmal vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233668/rekursive-fkt-läuft-nicht-wie-gewollt</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 17:14:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233668.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 07 Feb 2009 12:12:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 12:12:10 GMT]]></title><description><![CDATA[<p>Guten Tag</p>
<p>hab angefangen mich in c++ einzulesen, hab also so gut wie keine erfahrung von daher entschuldige ich mich falls dies ein zu triviales Problem ist.</p>
<p>Ich versuche in eine Datei Zeile für Zeile alle möglichen Folgen der Zahlen 0 und 1 der Länge n zu schreiben.</p>
<p>Hab hier erstmal n=3 gesetzt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;fstream&gt;

using namespace std;

int n=3;
int t=1;
int s=1;
int *I = new int[n];
int forfkt(int);

int main()
{
	ifstream file(&quot;Indikatorfolge.txt&quot;);
		if(file.is_open())
		{
		remove(&quot;Indikatorfolge.txt&quot;);
		}

	forfkt(t);
}

int forfkt(int t)
{
	std::ofstream ofs(&quot;Indikatorfolge.txt&quot;, std::ios::app);

	for(I[t]=1; I[t]&gt;=0; I[t]--)
	{
		if(t&lt;n)
		{
			t++;
		    forfkt(t);
		}
		else
		{
			for(s=1; s&lt;=n; s++)
			{
		    ofs &lt;&lt; I[s] ;
			}
			ofs &lt;&lt; std::endl;
		}

	}

};
</code></pre>
<p>Als Ausgabe bekomme ich:<br />
111<br />
110<br />
101<br />
100</p>
<p>Dies ist zwar schon schön, aber leider fehlen alle Kombinationen bei denen eine 0 vorne steht.</p>
<p>Falls jemand eine simplere Methode hat wäre ich natürlich auch dafür dankbar,<br />
jedoch würde ich auch gern verstehen warum die Rekursion nur den Fall I[1]=1 durchläuft denn wenn ich es ohne Rekursion schreibe funktioniert es:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;fstream&gt;

using namespace std;

int n=3;
//t=1;
int *I = new int[n];

int main()
{
	ifstream file(&quot;Indikatorfolge.txt&quot;);
		if(file.is_open())
		{
		remove(&quot;Indikatorfolge.txt&quot;);
		}

	std::ofstream ofs(&quot;Indikatorfolge.txt&quot;, std::ios::app);

	for(I[1]=1; I[1]&gt;=0; I[1]--)
	{

		for(I[2]=1; I[2]&gt;=0; I[2]--)
		{

			for(I[3]=1; I[3]&gt;=0; I[3]--)
			{
				ofs &lt;&lt; I[1] &lt;&lt; I[2] &lt;&lt; I[3] &lt;&lt; std::endl;
			}
		}
	}
}
</code></pre>
<p>Schonmal vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659481</guid><dc:creator><![CDATA[dfgbn]]></dc:creator><pubDate>Sat, 07 Feb 2009 12:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 13:41:14 GMT]]></title><description><![CDATA[<p>also als einfachste methode bietet sich die stl an</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a[] = {1, 0, 0};
    for(int i = 0; i &lt; 8; ++i)
    {
        next_permutation(a, a+2);
        cout &lt;&lt; a[0] &lt;&lt; a[1] &lt;&lt; a[2] &lt;&lt; endl;
    }
}
</code></pre>
<p>ungefähr so</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659516</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 07 Feb 2009 13:41:14 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 14:50:31 GMT]]></title><description><![CDATA[<p>Er will ja nicht permutieren, sondern {0,1}^3 aufzählen, wenn ich das richtig verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659558</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 07 Feb 2009 14:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 18:44:24 GMT]]></title><description><![CDATA[<p>Du ändert t in Zeile 37. Das ist aber wohl nicht so gedacht. Es reicht t+1 der Funktion zu übergeben.</p>
<p>Zudem ist dein Code ein Beispiel schlechten Stils <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/1659680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659680</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Sat, 07 Feb 2009 18:44:24 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 19:19:10 GMT]]></title><description><![CDATA[<p>probiers mal damit, das hab ich vor ner ewigkeit im physik unterricht gemacht ( ich steh nicht auf physics <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="😃"
    /> )</p>
<p>isn bissel allgemeiner</p>
<p>übrigens, basiert darauf das ich ne formel für die eingänge der wahrheitstabellen gesucht hab, falls du den algorithmus nachvollziehen willst.</p>
<pre><code class="language-cpp">#include &lt;math.h&gt;
#include &lt;iostream.h&gt;
//---------------------------------------------------------------------------
// Lukas Bockel @ 27.5.08
int main(int argc, char* argv[])
{
  unsigned long Row;
  char Character [] = {  '0', '1' };
  /*
  char Character[26*2+10];
  for ( char i = 'a'; i &lt;= 'z'; i ++ ){
    Character[i-97] = i;
  }
  for ( char i = 'A'; i &lt;= 'Z'; i ++ ){
    Character[i-65+26] = i;
  }
  for ( char i = '0'; i &lt;= '9'; i ++ ){
    Character[i+(2*26)-48] = i;
  }
  */
  //short AmoutofCharacters = 2*26+10;// Anzahl Buchstaben
  short AmoutofCharacters = 2;
  short StringLenght = 3;// Anzahl Character im zu erstellenden String
  /*
  cout &lt;&lt; &quot;Row Angeben.\n&quot;;
  cout &lt;&lt; &quot;Maximale Row = &quot;&lt;&lt;pow(AmoutofCharacters,StringLenght)&lt;&lt;endl;
  cin &gt;&gt; Row;
  cout &lt;&lt; endl;
  */
  char * String = new char[StringLenght];
  for ( int i = 0; i &lt; StringLenght; i++)String[i] = 0;
  for ( Row = 1; Row &lt;= powl(AmoutofCharacters,StringLenght); Row++){
    for ( int i = 0; i &lt; StringLenght; i++ ){
      if ( Row &gt; (powl(AmoutofCharacters,StringLenght)))break;// Falls ihr ohne die for schleife außen rum arbeitet das hier drinn lassen!

      unsigned long Calc =(((unsigned long)powl( AmoutofCharacters, i ))*AmoutofCharacters);
      unsigned long Temp = Row % Calc;

      if ( i == 0 ){//Ist es die erste Spalte?
        if ( Temp == 0 )Temp = AmoutofCharacters;
         String[i] = Character[Temp-1];
         //cout &lt;&lt; Character[Temp-1];
      }else{
        if ( Temp == 0 ){// Wurde die Zahlenreihe schon Wiederholt?
          String[i] = Character [AmoutofCharacters-1];
          //cout &lt;&lt; Character [AmoutofCharacters-1];
        }else {
          String[i] = Character [((int)ceil(Temp/powl( AmoutofCharacters, i )))-1];
          //cout &lt;&lt; Character [((int)ceil(Temp/powl( AmoutofCharacters, i )))-1];
        }
      }
    }
  cout.write(String,StringLenght);
  cout &lt;&lt; endl;
  }
  delete [] String;
return 0;
}
//---------------------------------------------------------------------------
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1659710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659710</guid><dc:creator><![CDATA[Schurke]]></dc:creator><pubDate>Sat, 07 Feb 2009 19:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Sat, 07 Feb 2009 23:28:13 GMT]]></title><description><![CDATA[<p>Wenn es auch iterativ sein darf, hätt ich für dich eine schnelle und kompakte Lösung.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
using namespace std;

void printBin(const int n);

int main()
{
	printBin(3);
	return 0;
}

void printBin(const int n)
{
	int perm = pow(2, n);

	for ( int i=0; i&lt;perm; i++)
	{
		for ( int j=n-1; j&gt;=0; j-- )
		{
			if ( i &amp; ( 1 &lt;&lt; j ) )
				cout &lt;&lt; 1;
			else
				cout &lt;&lt; 0;
		}
		cout &lt;&lt; endl;
	}
}
</code></pre>
<p>Der Code führt zu folgender Ausgabe:</p>
<p>000<br />
001<br />
010<br />
011<br />
100<br />
101<br />
110<br />
111</p>
<p>Die Funktion funktioniert aber nur für: 1 &lt;= n &lt;= sizeof(int)*8</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1659786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1659786</guid><dc:creator><![CDATA[NeoGreen]]></dc:creator><pubDate>Sat, 07 Feb 2009 23:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Mon, 09 Feb 2009 19:57:27 GMT]]></title><description><![CDATA[<p>Vielen Dank an alle für die Hilfe, werde jetzt mal versuchen all die Alternativen zu verstehen.<br />
Die iterative Version gefällt mir wirklich gut. Und die Reichweite für n ist auch erstmal genug, aber woran liegt diese Beschränkung?</p>
<p>@ lagalopex<br />
Ja ich gebe dir recht das mein code keinen Preis für Eleganz gewinnen würde, ich hab halt noch einiges an Büchern und Einführungen zu lesen. Hab erst vor ein paar Tagen damit angefangen und bin schon froh gewesen etwas zusammengebastelt zu bekommen was einigermassen das tut was ich wollte.<br />
Wäre natürlich für jeden Tip dankbar was man nicht machen sollte, damit ich mir garnicht erst was falsches angewöhne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1660770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1660770</guid><dc:creator><![CDATA[dfgbn]]></dc:creator><pubDate>Mon, 09 Feb 2009 19:57:27 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursive Fkt. läuft nicht wie gewollt on Mon, 09 Feb 2009 20:35:44 GMT]]></title><description><![CDATA[<p>dfgbn schrieb:</p>
<blockquote>
<p>Vielen Dank an alle für die Hilfe, werde jetzt mal versuchen all die Alternativen zu verstehen.<br />
Die iterative Version gefällt mir wirklich gut. Und die Reichweite für n ist auch erstmal genug, aber woran liegt diese Beschränkung?</p>
</blockquote>
<p>Die Funktion gibt die Binärrepresentation einer int Zahl aus.<br />
also 1 mit z.B. 4 bit = 0001<br />
2 = 0010<br />
3 = 0011 usw.</p>
<p>Folgender Teil</p>
<pre><code class="language-cpp">if ( i &amp; ( 1 &lt;&lt; j ) )
</code></pre>
<p>prüft sukzessive ob ein Bit an Stelle 0 bis n-1 gesetzt ist und gibt dementsprechend eine 1 oder 0 aus.<br />
Die Variable i wird also immer mit einem bitweisen UND und der Zahl 1 (geshiftet um j stellen nach links) verknüpft. Ist ein Bit an der zu vergleichenden Stelle gesetzt, ist das Ergebnis des bitweisen UND die Zweierpotenz dieser Stelle. Im anderen Fall ist das Ergebnis 0.</p>
<p>Da ja nur die Binärrepresentation ausgegeben wird, funktioniert dies maximal für die Stellenanzahl eines int und die lässt sich mit sizeof(int)*8 bestimmen. Für noch breitere Bereiche könnte man die Schleifenvarible i z.B. als long long definieren und würde somit n auf sizeof(long long)*8 erweitern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1660795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1660795</guid><dc:creator><![CDATA[NeoGreen]]></dc:creator><pubDate>Mon, 09 Feb 2009 20:35:44 GMT</pubDate></item></channel></rss>