Brauche Hilfe bei Funktion



  • Hi, ich hab noch eine Frage und zwar gibt das Programm den größten gemeinsamen Teiler aus und sieht so aus:

    #include <stdio.h>
    
    int ggt(int a, int b)
    { 
    	if (b==0) 
    		return(a);
    	else 
    		return(ggt(b,a%b));
    }
    
    void main()
    { 
    	int a,b;
    
    	printf("\nBerechnung des groessten gemeinsamen Teilers");
    	printf("\n\nEingabe von a: ");
    	scanf("%i",&a);
    	printf("Eingabe von b: ");
    	scanf("%i",&b);
    	printf("\nDer groesste gemeinsame Teiler ist %i", ggt(a,b));
    }
    

    Hier wird rekursives programmieren benutzt, aber ich verstehe nicht, was das genau sein soll...

    und kann mir mal bitte einer erklären, was diese Zeile

    return(ggt(b,a%b));

    bedeuten soll und was dann passiert??

    Danke im voraus,
    Ania



  • Willst Du einen Glaubenskrieg eroeffnen?

    Zur Einfuehrung:

    http://en.wikipedia.org/wiki/Recursion



  • was fuern glaubenskrieg? der/die OP hat einfach nicht die hausaufgaben gemacht und "rekursion" bei google/wikipedia nachgeschlagen.



  • c.rackwitz schrieb:

    was fuern glaubenskrieg?

    Jene Glaubenskriege ueber die Vor- und Nachteile von Recursionen. Diese sind zwar nach herrschender Softwarelehre gegen die Recursion entschieden, aber manchmal kommt man nicht darum (mein letzte Beispiel war eine Methode, die Ringstrukturen finden sollte - das ginge zwar mit ohne Rekursion, waere aber so umstaendlich gewesen, dass ich doch zu einer griff).



  • ich weiß, die funktion ruft sich nocheinmal in der funktion auf, aber ich verstehe trotzdem nicht was die eine zeile macht...

    kann mir das auch gegen ein glaubenskrieg mal einer erklären? ich brauch das für die schule und da ist es denen egal, ob man sowas benutzt oder nicht..... nur vor goto haben sie ns gewarnt 😃



  • ich wusste nicht, dass man ueber rekursion nen glaubenskrieg fuehren kann...
    ich meine, ist doch klar, was man nehmen soll.
    wenns auf performance ankommt, benchmarkt man beide methoden in der optimalimplementation und nimmt die schnellere.
    wenns auf lesbarkeit ankommt, implementiert man beide und entscheidet sich fuer die, die man (oder das team) am lesbarsten haelt. dies wird ggf. in einer demokratischen abstimmung entschieden (evtl. gewichtet nach erfahrung in jahren oder anzahl der beherrschten sprachen fuer jeden teilnehmenden).



  • @aniaaa: nur eine Anmerkung von mir, ist mir in deinen letzten Threads auch aufgefallen. Die void main Deklaration ist veraltet und mittlerweile falsch. Mach es so

    int main()
    {
        return 0; /* 0 wenn es keine Fehler gab */
    }
    

    oder

    int main(void)
    {
        return 0; /* 0 wenn es keine Fehler gab */
    }
    


  • @c.rackwitz

    Ich spielte auf jene Auseinadersetzungen, die u. a. hier parodiert wurden:

    http://www.physics.ohio-state.edu/~bcd/humor/software.wars.html

    Aber ernsthafter: Recursionen sind meistens eleganter und klarer, brauchen jedoch mehr Stack und die pushs und pops machen halt das Programm langsamer; man muss sehen, ob man diesen Nachteil in Kauf oder halt nicht. Man kann den Stackgebrauch durch geschicktes Block- und Unterfunktionsdesign minimieren, aber das geht dann wieder an die Performance.

    Ich persoenlich benutze sie dann, wenn das Aufloesen der Recursion einfach zu umstaendlichen Code fuehren wuerde.



  • aniaaa schrieb:

    ich weiß, die funktion ruft sich nocheinmal in der funktion auf, aber ich verstehe trotzdem nicht was die eine zeile macht...

    Naja, genau das, was Du gesagt hast. Was gibt's da noch zu verstehen?



  • das programm macht sich die mathematische gesetzmäßigkeit zunutze, daß ggt(a,b)==ggt(b,a%b) ist. bei wiederholter umwandlung von ggt(a,b) nach ggt(b,a%b) werden die funktionsparameter immer kleiner bis die rekursionsende-bedingung b==0 erfüllt ist. und ggt(a,0) ist immer a.

    die rekursion reduziert also das problem ggt(a,b) auf das einfachere problem ggt(a,0).

    zum thema glaubenskrieg: natürlich könnte man das ggt-problem effizienter mit einer iteration lösen. schließlich ist die ggt()-funktion nur endrekursiv. allerdings sind echt rekursive algorithmen wie etwa quicksort meist komplizierter und werden deshalb, wenn es darum geht, rekursion zu erklären, nicht so gern verwendet.



  • Danke euch allen.... 🙂

    Ich habs jetzt auch endlich verstanden !!

    Und was void main() angeht, dass kann gut sein, dass man es so nicht mehr macht... aber mein lehrer besteht glaub uich drauf, dass wir das erstmal so machen....

    thx, ania


Anmelden zum Antworten