Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3
Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3
Grundkurs Informatik Aufgabensammlung mit Lösungen Teil 3
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