ggT will nicht -.-



  • Hallo Leute,

    ich bereit mich auf ne wichtige klausur vor und bin jetzt dabei mir die rekursiven funktionen rein zu pauken. Lief auch bis jetzt, nur will diese nicht so wie ich will, entweder bin ich in der rübe schon so matsch das ichs schlicht und einfach übersehe oder es ist einfach falsch.

    #include <stdio.h>
    
    int ggT(int a,int b){
    	int c;
    
    	c=a-b;
    
    	if (c != 0) {
    
    	if (c <= a) {
    		ggT(a,c);
    	}
    	if (c >= a) {
    		ggT(c,a);
    	}
    
    	}
    
    	return a;
    
    }
    
    int main(){
    	int x,y,z;
    
    	printf("ggT bestimmten -> a und b eingeben:");
    	scanf("%d",&x);
    	printf("dein a ist : %d",x);
    	scanf("%d",&y);
    	printf("dein b ist : %d",y);
    	z=ggT(x,y);
    	printf("ggT iiiiist :%d",z);
    
    }
    


  • Du ignorierst ja auch die Rückgabewerte der rekursiven Aufrufe komplett.



  • int ggT(int a,int b){
    	int c;
    
    	c=a-b;
    	return c;
    
    	if (c != 0) {
    
    	if (c <= a) {
    		ggT(a,c);
    	}
    	if (c >= a) {
    		ggT(c,a);
    	}
    
    	}
    	if (c == 0) {
    		return a;
    	}
    
    }
    

    jetzt läuft das prog zwar ohne fehler zuende aber gibt mir auch kein ergebniss aus...



  • SG1 schrieb:

    Du ignorierst ja auch die Rückgabewerte der rekursiven Aufrufe komplett.

    Das gilt immer noch.

    Was ist der Unterschied zwischen dem Aufruf von ggt in main und in ggt ?



  • okay, ich glaub ich ahne wo das problem liegt.

    int ggT(int a,int b){ 
        int c; 
    
    	c=a-b;
    
        if (c != 0) { 
    
    		if (c < a) { 
    			return c;
    			ggT(a,c);
    
    		} 
    		if (c > a) { 
    			return c;
    			ggT(c,a);
    
    		} 
    
        }
     	return a;
    
    }
    

    jetzt spuckt der mir nur 30 aus, also läuft nur einmal durch, wie krieg ich das so hin das die funktion sich selber c zurück gibt??



  • int ggT(int a,int b){ 
        int c; 
    
    	c=a-b;
    
    	if (c == 0) {
    		return a;
    	}else if (c<a) {
    			return ggT(a,c);
    		}else {
    			return ggT(c,b);
    		}
    
    	}
    

    kann mir einer sagen wo da konkret der fehler liegt?



  • wintik schrieb:

    int ggT(int a,int b){ 
        int c; 
    	
    	c=a-b;
    	
    	if (c == 0) {
    		return a;
    	}else if (c<a) {
    			return ggT(a,c);
    		}else {
    			return ggT(c,b);
    		}
    
    	}
    

    kann mir einer sagen wo da konkret der fehler liegt?

    Und was geht daran genau nicht? Wenn du Hilfe willst, mach es den Leuten nicht so schwer, sondern sag konkret, was anders läuft, als du es dir gedacht hast.!



  • okay sorry,

    ich habs jetzt so gemacht wie es logisch in der aufgabe steht
    (soll ggT ohne modulo berechnen, immer die differenz bilden und dann mit einem der Werte tauschen, solang bis die differenz 0 ist und dann müsste der ggt in a und b stehen)

    mit dem code im vorletzten post denk ich ist das richtig umgesetzt, nur spuckt er mir das aus

    ggT bestimmten -> a und b eingeben:48
    dein a ist : 48
    18
    dein b ist : 18

    und dann ne menge fehler, also stimmt irgendwas in der ggT funktion nicht, aber ich komm nach stunden rumgebastel nicht drauf und verzweifel mittlerweile



  • Versuchs mal so:

    int ggT(int a, int b)
    {
        int c = a - b;
    
        if (c == 0) 
    	{
            return a;
        }
    	else if (c > a)
    	{
    		return ggT(c, a);
    	}
    
    	return ggT(b, c);
    }
    

    Wie bin ich darauf gekommen? Ich habe mir für jeden Funktionsaufruf a, b und c ausgeben lassen und gesehen, dass es eine Endlosschleife wird.



  • ahh, vielen vielen dank! 🙂
    ich merk mir dem tipp mit der extra ausgabe 😃



  • Noch ein Hinweis zu dieser Lösung und dem Fehler. Du hast ja geschrieben, dass die Parameter vertauscht werden soll. Du hast aber für a immer wieder a und für b immer wieder b übergeben. Ein Tausch fand also nie statt.

    Deshalb die umgedrehte Reihenfolge der Parameter in der Lösung.

    Und da vorher auch nie ein Tausch statt fand ging das Programm natürlich immer tiefer in die Rekursion, da die Abbruchbedingung nie erfüllt werden konnte.



  • okay wo dus grad schreibst, ich hatte den code jetzt x-mal abgeändert und zum schluss hin garnicht drauf geachtet, ganz am anfang fand noch ein wechsel statt, habs mir auf dem papier aufgeschrieben wie es ablaufen muss und dann schlichtweg vergessen beim ganzen hin und her 😕



  • hab noch eine frage die sich nicht direkt um eine aufgabe dreht,

    und zwar wollte ich mal nach tipps zum angehen einer rekursion fragen, also bei mir sieht es so aus, dass ich eine aufgabe gestellt krieg in der in worten beschrieben wird wie die rekursion ablaufen soll zu irgendwas, sei es fakultät, potenz oder garnichts direkt über mathe. Vielleicht hat ja jemand ein zwei kniffe parat mit denen er dann aus diesem text einfach eine rekursionsvorschrift macht?


Anmelden zum Antworten