Einsendung:

Lösungsvorschlag

int ggt(int a, int b)
{
   int temp;
   // a soll größer als b sein
   if (b>a)
   {// a und b vertauschen
      temp = a;
      a = b;
      b = temp;
   };

   while (b!=0
   {
      temp = a;
      a = b;
      b = temp % b;
   };

   return a;
};

Ja, das ist sehr gut.
Sie sollten aber zum Vertauschen der beiden Variablen die swap-Funktion aufrufen, weil der aussagekräftige Name swap noch leichter zu verstehen ist, als der Dreieckstausch.
Außerdem ist es netter, die Variable temp im Block lokal zu halten.

int ggt(int a, int b)
{
   // a soll größer als b sein
   if(b>a)
      swap(a,b);

   while(b!=0
   {
      int temp=a;
      a=b;
      b=temp%b;
   };

   return a;
};

Nur zur Anregung habe ich noch einen kleinen Vorschlag: Ich war mal mit ein paar Algorithmen zur Kryptologie beschäftigt, in denen sehr oft solche Schleifen vorkamen. Immer wurde der neue Wert in Abhängigkeit von den beiden alten Werten berechnet. Zu diesem Zweck habe ich mir die folgende Funktion einfallen lassen:

void shift(int &x,int &y,int z)
{
   x=y;
   y=z;
};

Die Funktion mag recht abwegig aussehen. Die Bedeutung "x bekommt den Wert von y und y bekommt den Wert von z" sieht nicht so aus, als könne die Funktion sinnvoll sein. Immerhin könnte man einfach

   x=y;
   y=z;

schreiben. Die Funktion hat aber noch einen kleinen Trick eingebaut: Der Übergabe-Parameter z ist eine lokale Variable, die natürlich auch aus x und y berechnet worden sein kann. Dadurch spart man sich, eine lokale Variable zu definieren.
Das verkürzt die ggt-Funktion zu

int ggt(int a, int b)
{
   // a soll größer als b sein
   if(b>a)
      swap(a,b);

   while(b!=0
      shift(a,b,a%b);

   return a;
};

Leider wurde die ggt-Funktion nur kürzer, aber nicht einfacher. Wenn man die shift-Funktion nicht gewohnt ist, dann macht sie natürlich den Code eher unverständlich.
Diese shift-Funktion kann gut eingesetzt werden, um rekursiv definierte Funktionen in iterative Funktionen umzusetzen.
Zum Beispiel wird aus der Fibonacci-Folge
F(1)=1, F(2)=1, F(n)=F(n-2)+F(n-1)
die Funktion

int fibonacci(int n)
{
   int a=1,b=1;
   for(int i=2;i<n;++i)
      shift(a,b,a+b);
   return b;
};

Allgemein werden in die shift-Funktion nur die Werte von F(n-2), F(n-1) und F(n) in dieser Reihenfolge eingetragen.
Wenn man sich erst an diese Verwendung dieser Funktion gewöhnt hat, dann wird der Code sehr schön lesbar. Aber hier ist das Einführen einer neuen Funktion wohl wirklich übertrieben. Es war nur als Anregung gedacht, daß es manchmal sinnvoll sein kann, auch eine eher abwegige Lösung anzustreben.



Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00