Wert in einer rekursioven Funktion sichern



  • Guten Tag,

    Ich habe doch noch ein Problem bei meiner Mergesort-Aufgabe. Und zwar:

    void MergeSort(int* a, int Anfang, int Ende){
    	if(Anfang < Ende){
    	int Laenge ;
    	if (Laenge <= Ende){Laenge = 0;}
    	if(Laenge < Ende){Laenge = Ende;}
    	int Mitte = (Anfang + Ende) / 2;
    
    	MergeSort (a, Anfang, Mitte);
    
    	MergeSort (a, Mitte + 1, Ende);
    

    Ja, ich weiss, der code ist nich fehlerfrei, ich sehe auch den Fehler 😃
    Ich sage mal, was ich erreichen möchte: ich will dass "Laenge" den 1. Wert von Ende annimt und danach beim nächsten (rekusioven) AUfruf der Funktion sich nicht mehr ändert. Das, was ihr sieht, ist einer meiner letzten Versuche, und wie ihr schon ahnen konnt, hat sich das Programm wegen dem Widerspruch im Code aufgehängt 🙂 Irgendein VOrschlag, wie ich den Wert von Laenge sichern könnte?

    Vielen Dank im Vorauas
    babadura



  • deine if's am Anfang machen irgendwie garkeinen Sinn, vor allem der Vergleich mit ner uninitialisierten Variablen ist garnicht gut.
    Was willst du mit der Länge noch gleich erreichen?



  • ja, ich weiss, dass diese if's gar keinen Sinn machen 😃

    void Merge (int *a, int Anfang, int Mitte, int Ende /*,int Laenge*/){
    
    	int tmp[Ende - Anfang + 1], i = Anfang, j = Mitte+1;
    		for (int k=0;k<=Ende-Anfang;k++){
    			if ( (i<=Mitte) && (( j>Ende) || (a[i] < a[j]))){
    			tmp[k] = a[i];
    			i++;
    			}
    			else{
    			tmp[k]=a[j];
    			j++;
    			//cout<<a[i]<<" "<<a[j]<<endl;
    			}
    		}
    		for(int k=0; k<=Ende-Anfang;k++){
    		a[Anfang+k] = tmp[k];
    		}
    
    		for(int b=0;b<16;b++) //hier möchste ich "b<Laenge" haben 
                    {
    		cout<<a[b]<<" ";
    		}
    		cout<<endl;
    }
    
    void MergeSort(int* a, int Anfang, int Ende){
    	if(Anfang < Ende){
    	int Laenge = 0;
    	//if (Laenge <= Ende){Laenge = 0;}
    	//if(Laenge < Ende){Laenge = Ende;}
    	int Mitte = (Anfang + Ende) / 2;
    
    	//cout<<Anfang<<"  "<<Mitte<<" "<<Mitte+1<<" "<<Ende<<endl;
    	MergeSort (a, Anfang, Mitte);
    
    	MergeSort (a, Mitte + 1, Ende);
    
    	Merge (a, Anfang, Mitte, Ende/*, Laenge*/);
    
    	}
    }
    

    So sah meine Code ursprunglich aus. Mergesort wird natuerlich aus main aufgerufen. Das ist auch der grund, warum ich versuche Laenge in Mergesort so irgendwie an Merge zu übergeben, dass er nur den ganz ersten Wert übergibt, und nicht geänderten. Ich möchste quasi nicht auf dem Bildschirm nur eine konstate Anzahl von Zahlen ausgegeben bekommen. Ich glaube, ich habe mich wieder etwas unglücklich ausgedruckt, ich kann nur hoffen, dass Ihr mich verstanden habt 🙂

    babadura



  • babadura schrieb:

    ja, ich weiss, dass diese if's gar keinen Sinn machen 😃

    Dann setz uns doch nichts vor was uns verwirrt.
    Warum reichst du die Länge nicht einfach durch - nur in der äußersten Funktion (dem einzigen Aufruf der von außen kommt) übergibst du nichts oder lässt sie berechnen.

    void Merge (int *a, int Anfang, int Mitte, int Ende ,int Laenge){
    	int tmp[Ende - Anfang + 1], i = Anfang, j = Mitte+1;
    	for (int k=0;k<=Ende-Anfang;k++){
    		if ( (i<=Mitte) && (( j>Ende) || (a[i] < a[j]))){
    			tmp[k] = a[i];
    			i++;
    		}
    		else{
    			tmp[k]=a[j];
    			j++;
    			//cout<<a[i]<<" "<<a[j]<<endl;
    		}
    	}
    	for(int k=0; k<=Ende-Anfang;k++){
    		a[Anfang+k] = tmp[k];
    	}
    
    	for(int b=0;b<Laenge;b++){
    		cout<<a[b]<<" ";
    	}
    	cout<<endl;
    }
    
    void MergeSort(int* a, int Anfang, int Ende, int Laenge = 0){
    	if (Laenge==0) Laenge = Ende-Anfang;
    
    	if(Anfang < Ende){
    		int Mitte = (Anfang + Ende) / 2;
    		//cout<<Anfang<<"  "<<Mitte<<" "<<Mitte+1<<" "<<Ende<<endl;
    		MergeSort (a, Anfang, Mitte, Laenge);
    		MergeSort (a, Mitte + 1, Ende, Laenge);
    		Merge (a, Anfang, Mitte, Ende, Laenge);
    	}
    }
    

    Ich hab dir die Einrückungen mal korrigiert und cpp-Tags spendiert, so wies war wars schrecklich und inkonsistent.

    Alternative gibts auch noch:

    void DoMergeSort(int* a, int Anfang, int Ende, int Laenge){
    	if(Anfang < Ende){
    		int Mitte = (Anfang + Ende) / 2;
    		//cout<<Anfang<<"  "<<Mitte<<" "<<Mitte+1<<" "<<Ende<<endl;
    		DoMergeSort (a, Anfang, Mitte, Laenge);
    		DoMergeSort (a, Mitte + 1, Ende, Laenge);
    		Merge (a, Anfang, Mitte, Ende, Laenge);
    	}
    }
    
    //Die hier wird in der main aufgerufen:
    void MergeSort(int* a, int Laenge){ 
    	if (Laenge>0){
    		DoMergeSort(a, 0, Laenge, Laenge);
    	}
    }
    


  • Vielen Dank, jetzt funktioniert es. Na ja, warum ist es mir selber nicht eingefallen?..

    Ansonsten - es tut mir leid für die unverständliche code - bin ein Programmieranfänger und schönheits-OP werde ich nur gleich durchführen. Hoffentlich lerne ich irgendwann mal auch ohne OPs auszukommen.

    Ich entschuldige mich auch für den eher unverständlichen Code aus dem 1. Beitrag - irgendwie ist mir mein Code so vertraut gewesen, dass ich dachte, es ist der ganzen Welt vertraut. 😉

    Liebe Grüße
    Babadura



  • babadura schrieb:

    Hoffentlich lerne ich irgendwann mal auch ohne OPs auszukommen.

    Hoffentlich nicht. Es gibt an jedem Code immer stellen, die verbessert werden können. Man schaffts quasi nie im ersten Wurf Den Idealen Code hinzuschreiben. Wenn du also irgendwann meinst dass du ohne Refactoring und kontinuierliche Verbesserungen auskommst hats du das Stadium erreicht wo dein Code unweigerlich vergammelt.


Anmelden zum Antworten