<?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[Rekursionsprobleme]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein typisches Anfängerproblem.<br />
Meine Aufgabe lautet eine Menge Gewinnzahlen (g[]) rekursiv mit einer Menge Tippzahlen (t[]) zu vergleichen und die Übereinstimmungen zu zählen.<br />
Iterativ war das Problem in 5-7min bewältigt. Rekursiv sitze ich jetzt schon einen ganzen Nachmittag dran. Hier mein Code :</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

int lottovergleich(int n, int m, int t[], int g[]);

int main(int argc, char *argv[])
{
  int i, t[100], g[100], n, treffer;
  cout &lt;&lt; &quot;Geben Sie die Anzahl der Gewinn-/Tippzahlen ein : &quot;;
  cin &gt;&gt; n;
  cout &lt;&lt; &quot;Geben Sie die Gewinnzahlen ein : &quot; &lt;&lt; endl;
  for(i=0; i&lt;n; ++i)
  {
    cin &gt;&gt; g[i];
  }
  cout &lt;&lt; &quot;Geben Sie die Tippzahlen ein : &quot; &lt;&lt; endl;
  for(i=0; i&lt;n; ++i)
  {
    cin &gt;&gt; t[i];
  }
  treffer = lottovergleich(n-1, n-1, t, g);
  cout &lt;&lt; endl &lt;&lt; &quot;Die Tippzahlen enthalten &quot; &lt;&lt; treffer &lt;&lt; &quot; Treffer!&quot; &lt;&lt; endl; 
  return EXIT_SUCCESS;
}

int lottovergleich(int n, int m, int t[], int g[])
{
  int z=0;

  if( n==0 )
  {
    if( m==0 )
    {
     //
    }
    else
    {
      z = z + lottovergleich(n, m-1, t, g);
    }
  }
  else
  {
    z = z + lottovergleich(n-1, m, t, g);
  }
  if( t[n] == g[m] )++z;
  return z;
}

/*
int lottovergleich(int n, int m, int t[], int g[])
{
  int j=0, z=0;

  if(n==0)
  {
    for(j=0; j&lt;m; j++)
    { 
      if(t[n]==g[j])
	z++;
    }
  }
  else
  {
    z = lottovergleich(n-1, m, t, g);
  }
  return z;
}
*/
</code></pre>
<p>Die auskommentierte lottovergleich-Funktion funktioniert aber eben wieder mit einer iterativen Schleife.<br />
Im Debugger kann ich erkennen, dass die Funktion bei 3 Gewinn-/Tippzahlen nicht 9 sondern nur 5 Vergleiche anstellt (n/m : 1. 0/0, 2. 0/1, 3. 0/2, 4. 1/2, 5. 2/2).<br />
Wo liegt mein Denkfehler?</p>
<p>Vielen Dank schon mal</p>
<p>Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/128386/rekursionsprobleme</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 17:17:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128386.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Dec 2005 10:58:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rekursionsprobleme on Sat, 03 Dec 2005 10:58:08 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe ein typisches Anfängerproblem.<br />
Meine Aufgabe lautet eine Menge Gewinnzahlen (g[]) rekursiv mit einer Menge Tippzahlen (t[]) zu vergleichen und die Übereinstimmungen zu zählen.<br />
Iterativ war das Problem in 5-7min bewältigt. Rekursiv sitze ich jetzt schon einen ganzen Nachmittag dran. Hier mein Code :</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

int lottovergleich(int n, int m, int t[], int g[]);

int main(int argc, char *argv[])
{
  int i, t[100], g[100], n, treffer;
  cout &lt;&lt; &quot;Geben Sie die Anzahl der Gewinn-/Tippzahlen ein : &quot;;
  cin &gt;&gt; n;
  cout &lt;&lt; &quot;Geben Sie die Gewinnzahlen ein : &quot; &lt;&lt; endl;
  for(i=0; i&lt;n; ++i)
  {
    cin &gt;&gt; g[i];
  }
  cout &lt;&lt; &quot;Geben Sie die Tippzahlen ein : &quot; &lt;&lt; endl;
  for(i=0; i&lt;n; ++i)
  {
    cin &gt;&gt; t[i];
  }
  treffer = lottovergleich(n-1, n-1, t, g);
  cout &lt;&lt; endl &lt;&lt; &quot;Die Tippzahlen enthalten &quot; &lt;&lt; treffer &lt;&lt; &quot; Treffer!&quot; &lt;&lt; endl; 
  return EXIT_SUCCESS;
}

int lottovergleich(int n, int m, int t[], int g[])
{
  int z=0;

  if( n==0 )
  {
    if( m==0 )
    {
     //
    }
    else
    {
      z = z + lottovergleich(n, m-1, t, g);
    }
  }
  else
  {
    z = z + lottovergleich(n-1, m, t, g);
  }
  if( t[n] == g[m] )++z;
  return z;
}

/*
int lottovergleich(int n, int m, int t[], int g[])
{
  int j=0, z=0;

  if(n==0)
  {
    for(j=0; j&lt;m; j++)
    { 
      if(t[n]==g[j])
	z++;
    }
  }
  else
  {
    z = lottovergleich(n-1, m, t, g);
  }
  return z;
}
*/
</code></pre>
<p>Die auskommentierte lottovergleich-Funktion funktioniert aber eben wieder mit einer iterativen Schleife.<br />
Im Debugger kann ich erkennen, dass die Funktion bei 3 Gewinn-/Tippzahlen nicht 9 sondern nur 5 Vergleiche anstellt (n/m : 1. 0/0, 2. 0/1, 3. 0/2, 4. 1/2, 5. 2/2).<br />
Wo liegt mein Denkfehler?</p>
<p>Vielen Dank schon mal</p>
<p>Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/932932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/932932</guid><dc:creator><![CDATA[sankafahrer]]></dc:creator><pubDate>Sat, 03 Dec 2005 10:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursionsprobleme on Sat, 03 Dec 2005 18:46:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<blockquote>
<pre><code class="language-cpp">int lottovergleich(int n, int m, int t[], int g[])
{
  int j=0, z=0;

  if(n==0)
  {
    for(j=0; j&lt;m; j++)
    {
      if(t[n]==g[j])
    z++;
    }
  }
  else
  {
    z = lottovergleich(n-1, m, t, g);
  }
  return z;
}
</code></pre>
</blockquote>
<p>Auch in dieser &quot;iterativen&quot; Version vergleichst du nicht jede Tippzahl mit jeder Gewinnzahl, sondern nur die erste Tippzahl (t[0]) mit allen Gewinnzahlen <em>abgesehen von der letzten</em>.</p>
<p>Der Denkfehler in deiner rekursiven Variante liegt darin, dass du nur die folgenden Array-Indizes miteinander vergleichst:</p>
<pre><code>t[0] mit g[0]
t[0] mit g[1]
t[0] mit g[2]
t[1] mit g[2]
t[2] mit g[2]
</code></pre>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/933336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/933336</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sat, 03 Dec 2005 18:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursionsprobleme on Sat, 03 Dec 2005 19:09:59 GMT]]></title><description><![CDATA[<p>Ok hab erst vergessen dass es um Lottozahlen geht...</p>
<pre><code class="language-cpp">bool vorhanden(int wert, int* array, int num)
{
	for(int i=0; i&lt;num; ++i) {
		if(wert == array[i]) {
			return true;
		}
	}
	return false;
}

int treffer(int* a, int* b, int numa, int numb)
{
	if(numa == 0) {
		return 0;
	}
	else if(vorhanden(*a, b, numb)) {
		return 1 + treffer(a + 1, b, numa - 1, numb);
	}
	else {
		return treffer(a + 1, b, numa - 1, numb);
	}
}
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/933349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/933349</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Sat, 03 Dec 2005 19:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursionsprobleme on Sun, 04 Dec 2005 14:04:26 GMT]]></title><description><![CDATA[<p>Vielen Dank schon mal.</p>
<p>-&gt;<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6091">@caipi</a><br />
meine iterative Lösung sieht so aus:</p>
<pre><code>int lottovergleich(int n, int m, int t[], int g[])
{
  int z=0, j=0, i=0;

  for(i=0; i&lt;n; ++i)
  {
    for(j=0; j&lt;m; ++j)
    {
       if(t[i] == g[j])
         ++z;
    }
  }
  return z;
}
</code></pre>
<p>natürlich dann nicht mit n-1 sondern mit n aufgerufen. Die funktioniert.<br />
Die auskommentierte Funktion aus meinem ersten Beitrag war nur ein Zwischenprodukt. Aber du hast recht, auch die hat den gleichen Denkfehler intus wie die völlig rekursive Funktion! Und genau da komme ich nicht weiter! Wie muss ich die Fkt. gestalten, dass alle Zahlen rekursiv verglichen werden? Auch die Lösung von FireFlow arbeite wieder mit einer iterativen Schleife. Genau das versuche ich zu umgehen. Weis jemand Rat?</p>
<p>Gruss<br />
Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/933788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/933788</guid><dc:creator><![CDATA[sankafahrer]]></dc:creator><pubDate>Sun, 04 Dec 2005 14:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursionsprobleme on Sun, 04 Dec 2005 14:17:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie muss ich die Fkt. gestalten, dass alle Zahlen rekursiv verglichen werden?</p>
</blockquote>
<p>Du willst also bei den folgenden beiden Arrays</p>
<pre><code class="language-cpp">int v1[3] = { 0, 1, 2 };
int v2[3] = { 2, 1, 0 };
</code></pre>
<p>das folgendermaßen verglichen wird:</p>
<pre><code>v1[0] mit v2[0]
v1[0] mit v2[1]
v1[0] mit v2[2]
v1[1] mit v2[0]
v1[1] mit v2[...]
v1[2] mit v2[0]
...
</code></pre>
<p>??<br />
Wenn ja: Vielleicht hilft dir folgender Ansatz weiter:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
size_t cmp(size_t n, size_t m, const T* const p_n, const T* const p_m)
{
    size_t count = 0;
    static size_t cpy_n = n;
    if(p_n[n] == p_m[m])
        ++count;

    if(n &gt; 0)
    {
        count = count + cmp(n - 1, m, p_n, p_m);
    }
    else if(m &gt; 0)
    {
        n = cpy_n;
        count = count + cmp(n, m - 1, p_n, p_m);
    }
    return count;
}
</code></pre>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/933802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/933802</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sun, 04 Dec 2005 14:17:52 GMT</pubDate></item><item><title><![CDATA[Reply to Rekursionsprobleme on Mon, 05 Dec 2005 09:05:35 GMT]]></title><description><![CDATA[<p>-&gt;<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6091">@caipi</a><br />
Vielen Dank!<br />
Jetzt hat's 'klick' gemacht.</p>
<p>Gruss<br />
Andy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/934708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/934708</guid><dc:creator><![CDATA[sankafahrer]]></dc:creator><pubDate>Mon, 05 Dec 2005 09:05:35 GMT</pubDate></item></channel></rss>