Seite 1 von 1

Anzahl der Durchläufe zählen?

Verfasst: Do Mai 29, 2014 2:52 pm
von Taiko
Hallo liebe Forengemeinde.

Ich habe ein Problem:
Ich sitze hier an der Hanoi Aufgabe und weiß nicht weiter...

Code: Alles auswählen

#include <stdio.h>

void bewege(char x, char y, char z, int n)
{
	static int count = 1;
	printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
	count++;
 if(n>1)  bewege(x, z, y, n-1);
 if (n>1) bewege(z, y, x, n-1);
  
}

main(void)
{
 int n;
 printf("DIE TUERME VON HANOI\n");
 printf("? Anzahl Scheiben = ");
 scanf("%d", &n);
 bewege('x', 'y', 'z', n);

}
das hier hab ich schon.
Mein Problem ist, daß ich jetzt eine Ausgabe machen muß, die mir nur ausgibt, wie viele Durchläufe ich brauche um zu dem Ende zu kommen.

Wie komme ich dahin?
Ich kapier das irgendwie nicht...
Ich habe es schon probiert mit Count, aber da werden dann nur alle Züge ausgegeben, nicht nur der letzte (d.h. er zählt hoch bis z.B. 15 und gibt nicht nur 15 aus).

Mit welcher Funktion kann ich das hin bekommen?

Vielen lieben Dank!!

Taiko

Re: Anzahl der Durchläufe zählen?

Verfasst: Do Mai 29, 2014 5:56 pm
von Nemo
Hi,

Dein Problem ist, dass du count innerhalb der Funktion bewege ausgeben lässt und bewege sich selbst immer wieder aufruft, wodurch auch count erneut ausgegeben wird.
So sollte es gehen:

Code: Alles auswählen

    #include <stdio.h>

    int bewege(char x, char y, char z, int n)
    {
       static int count = 1;
       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
       count++;
    if(n>1)  bewege(x, z, y, n-1);
    if (n>1) bewege(z, y, x, n-1);
    return count;
    }

    main(void)
    {
    int n;
    printf("DIE TUERME VON HANOI\n");
    printf("? Anzahl Scheiben = ");
    scanf("%d", &n);
    printf("%3d Züge sind notwendig.\n", bewege('x', 'y', 'z', n));

    }
Ich habe einfach bewege in eine Integer-Funktion verwandelt, die am Ende count zrückgibt, sodass es extern ausgegeben wird. Wenn du möchtest kannst du nun einfach diese Zeile:

Code: Alles auswählen

       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
weglassen und es wird nur noch die Anzahl der nötigen Züge ausgegeben.

Man könnte das Problem auch so lösen:

Code: Alles auswählen

    #include <stdio.h>

    void bewege(char x, char y, char z, int n)
    {
       static int count = 1;
       static int secondCount = 1;
       printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
       count++;
    if(n>1)  bewege(x, z, y, n-1);
    if (n>1) bewege(z, y, x, n-1);
       secondCount++;
    if(count==secondCount) printf("Es sind %3d Züge notwendig\n", count);
    }

    main(void)
    {
    int n;
    printf("DIE TUERME VON HANOI\n");
    printf("? Anzahl Scheiben = ");
    scanf("%d", &n);
    bewege('x', 'y', 'z', n);

    }
Diese Lösung hat den Vorteil, dass count innerhalb der Funktion bewege ausgegeben wird. Hier wird count immer vor und secondCount immer nach den erneuten Aufrufen von Bewege ausgeführt, sodass sie nur innerhalb des ersten Aufrufs von bewege count und secondCount gleich groß sind.

Welche Lösung du benutzt ist dir überlassen.

Re: Anzahl der Durchläufe zählen?

Verfasst: Do Mai 29, 2014 6:34 pm
von Taiko
Hi Nemo,

vielen Dank für deine Hilfe!!

Auf die Idee mit dem second Count wär ich nicht gekommen...
(gut, und das mit dem return count hab ich echt nicht gesehen..) :-)

Vielen Dank nochmals!!

Taiko

Re: Anzahl der Durchläufe zählen?

Verfasst: Fr Mai 30, 2014 10:34 am
von Xin
Taiko hat geschrieben: Mein Problem ist, daß ich jetzt eine Ausgabe machen muß, die mir nur ausgibt, wie viele Durchläufe ich brauche um zu dem Ende zu kommen.

Code: Alles auswählen

#include <stdio.h>

unsigned int bewege(char x, char y, char z, int n)
{
  unsigned int count = 1;
  printf("%3d: Bewege %5d:%c nach %c\n",count, n, x, y);
  if(n>1) count += bewege(x, z, y, n-1);
  if(n>1) count += bewege(z, y, x, n-1);  

  return count;
}
Die Funktion gibt zurück, wie oft sie aufgerufen wurde.