C-Programmierung: Rekursion

Aus Wikibooks

Wechseln zu: Navigation, Suche

[Bearbeiten] Rekursion

Eine Funktion, die sich selbst aufruft, wird als rekursive Funktion bezeichnet. Den Aufruf selbst nennt man Rekursion. Als Beispiel dient die Wikipedia-logo.png Fakultäts-Funktion n!, die sich rekursiv als n(n-1)! definieren lässt (wobei 0! = 1).

Hier ein Beispiel dazu in C:

  1. #include <stdio.h>
    
  2.  
    
  3. int fakultaet (int);
    
  4.  
    
  5. int main()
    
  6. {
    
  7.   int eingabe; 
    
  8.  
    
  9.   printf("Ganze Zahl eingeben: ");
    
  10.   scanf("%d",&eingabe);
    
  11.   printf("Fakultaet der Zahl: %d\n",fakultaet(eingabe));
    
  12.  
    
  13.   return 0;
    
  14. }
    
  15.  
    
  16. int fakultaet (int a)
    
  17. {
    
  18.   if (a == 0)
    
  19.     return 1;
    
  20.   else
    
  21.     return (a * fakultaet(a-1));
    
  22. }
    

[Bearbeiten] Beseitigung der Rekursion

Rekursive Funktionen sind in der Regel leichter lesbar als ihre iterativen Gegenstücke. Sie haben aber den Nachteil, dass für jeden Funktionsaufruf verhältnismäßig hohe Kosten anfallen. Eine effiziente Programmierung in C erfordert also die Beseitigung jeglicher Rekursion. Am oben gewählten Beispiel der Fakultät könnte eine rekursionsfreie Variante wie folgt definiert werden:

int fak_iter(int n)
{
  int i, fak;
  for (i=1, fak=1; i<=n; i++)
    fak *= i;
  return fak;
}

Diese Funktion liefert genau die gleichen Ergebnisse wie obige, allerdings wurde die Rekursion durch eine Iteration ersetzt. Offensichtlich kommt es innerhalb der Funktion zu keinem weiteren Aufruf, was die Laufzeit des Algorithmus erheblich verkürzen sollte. Komplexere Algorithmen - etwa Quicksort - können nicht so einfach iterativ implementiert werden. Das liegt an der Art der Rekursion, die es bei Quicksort notwendig macht, einen Stack für die Zwischenergebnisse zu verwenden. Eine so optimierte Variante kann allerdings zu einer Laufzeitverbesserung von 25-30% führen.

[Bearbeiten] Weitere Beispiele für Rekursion

Die Wikipedia-logo.png Potenzfunktion "y = x hoch n" soll berechnet werden:

  1. #include <stdio.h>
    
  2.  
    
  3. int potenz(int x, int n)
    
  4. {
    
  5.   if (n>0)
    
  6.     return (x*potenz(x,--n));  /* rekursiver Aufruf */
    
  7.   else
    
  8.     return (1); 
    
  9. }
    
  10.  
    
  11. int main(void)
    
  12. {
    
  13.   int x;
    
  14.   int n;
    
  15.   int wert;
    
  16.  
    
  17.   printf("\nGib x ein: ");
    
  18.   scanf("%d",&x);
    
  19.   printf("\nGib n ein: ");
    
  20.   scanf("%d",&n);
    
  21.  
    
  22.   if(n<0)
    
  23.   {
    
  24.     printf("Exponent muss positiv sein!\n");
    
  25.     return 1;
    
  26.   }
    
  27.   else
    
  28.   {
    
  29.     wert=potenz(x,n);
    
  30.     printf("Funktionswert: %d",wert);
    
  31.     return 0;
    
  32.   }
    
  33. }
    

Multiplizieren von zwei Zahlen als Ausschnitt:

int multiply(int a, int b)
{
  if (b==0) return 0;
  return a + multiply(a,b-1);
}


Persönliche Werkzeuge