30.11.2012 Aufrufe

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

3-16 Aufgaben und <strong>Lösungen</strong><br />

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />

Aufgabe 10.4 (P3)<br />

Schreiben sie ein rekursives und ein iteratives Programm zur Berechnung der Ackermann-<br />

Funktion. Vergleichen Sie die Ausführungszeiten.<br />

Lösung<br />

//***********************************************************************<br />

// Vergleich der rekursiven und iterativen<br />

// Berechnung der Ackermann-Funktion<br />

//***********************************************************************<br />

#include <br />

#include <br />

#include <br />

#define SMAX 100000<br />

//***********************************************************************<br />

// Iterative Berechnung der Ackermann-Funktion<br />

//-----------------------------------------------------------------------<br />

int ak_i(int x, int y) {<br />

int k, s[SMAX+2], sp=0; // Stack und Stack-Pointer<br />

s[sp++]=x; s[sp++]=y; // x und y in Stack eintagen<br />

while(sp!=1){<br />

//printf("\nS:"); for(k=0; k=SMAX) return -1; // Stack-Überlauf<br />

}<br />

return s[--sp]; // Ergebnis: letzter Stack-Eintrag<br />

}<br />

//***********************************************************************<br />

// Rekursive Berechnung der Ackermann-Funktion<br />

//-----------------------------------------------------------------------<br />

int ak_r(int x, int y) {<br />

if(x==0) return(y+1); // Abbruchkriterium<br />

if(y==0) return(ak_r(x-1,1)); // einfache Rekursion<br />

return(ak_r(x-1,ak_r(x,y-1))); // doppelte Rekursion<br />

}<br />

//***********************************************************************<br />

// Hauptprogramm<br />

//***********************************************************************<br />

int main() {<br />

int x=1,y=1, a=0; // Parameter deklarieren und vorbesetzen<br />

time_t t; // Zeit<br />

printf("\n\nACKERMANN-FUNKTION\n");<br />

while(x>0 && y>0) { // Solange x und y nicht 0 sind<br />

printf("\nx, y = ");<br />

scanf("%d,%d",&x,&y); // Eingabe von x und y<br />

t=clock(); // Anfangszeit merken<br />

printf("\nak_r = %d ",ak_r(x,y)); // ak(x,y) rekursiv<br />

printf("(%5.2f sec)\n",(float)difftime(clock(),t)/CLOCKS_PER_SEC);<br />

t=clock(); // Anfangszeit merken<br />

a=ak_i(x,y); // ak(x,y) iterativ<br />

if(a

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!