Rekursiver Aufruf von Waagengewichten

gregstar65

Mitglied
Hallo,

ich habe eine Aufgabe zur Rekursion, die ich nicht im Stande bin zu lösen. Es war eine Klausuraufgabe, die ich am vergangenen Samstag geschrieben habe.

Man stelle sich eine Waage vor und soll die entsprechenden Gegengewichte ermitteln. Der gegebene Code sah wie folgt aus:
Code:
public class Gegengewichte{

   public static void ermittle(gewichte, usw.){
       // hier sollte die rekursive Funktion erweitert werden


   }

   public static void main(String[] args){

      int[] gewichte = {22, 6, 4, 18};
      ermittle( gewichte, usw.);

Auf meine Nachfrage, ob der unklaren Aufgabenstellung habe ich gesagt bekommen, dass es einzig darum ginge herauszufinden, welche Gewichtskombinationen sich aus den vier Gewichten ergeben. Die sollten dann auch noch ausgegeben werden.

Meine Idee einen Baum mit einer Wurzel und je nach Tiefe (mit n=3, n=2, n=1) laufen zu lassen, ist jedenfalls nicht richtig. Ich habe zuhause weiter probiert, komme aber auf keinen Ansatz. Mein bisheriges Codefragment füge ich jetzt mal ein:

Code:
package rekursion;

public class Gegengewicht {

	
	public static void main(String[] args) {
		int[] gewichte = {22,6,4,18};
		Gegengewicht.ermittle(gewichte, gewichte.length);

	}

	private static void ermittle(int[] gewichte, int length) {
		// Rekursionsanfang
		if(length<0) {
			for(int i=0; i<gewichte.length; i++){
				System.out.print(gewichte[i]+" - ");
			}
		}// Rekursionsschritt
		else {
//                 Meine Ideen, leider ohne Wirkung, vermutlich fehlen Parameter:
//			ermittle(gewichte, length-1);
//	oder: 	ermittle(gewichte, length);
		}
	}
}
Das usw. steht übrigens nicht für einen festen Übergabeparameter, sondern es können auch mehr sein.

Wer Spass und Zeit hat, kann sich das Problem gerne antun. Ich habe die Aufgabe jedenfalls nicht bewältigt. Das muss aber nichts heißen 😳
 
So, :rtfm: ... Stunden später und ich habe einen Lösungsansatz: Permutation ist das Zauberwort!
Beim Versuch es zu implementieren, bin ich aber leider noch nicht viel weitergekommen.

Ich lande nach wie vor in einer Endlosschleife und bekomme auch keine Ausgabe hin.:bloed:

Für jede Idee bin ich dankbar:

Java:
public class Gegengewicht {

	
	public static void main(String[] args) {
		int[] gewichte = {22,6,4,18};
		Gegengewicht.ermittle(gewichte, gewichte.length);

	}

	private static void ermittle(int[] gewichte, int length) {
		// Rekursionsanfang
		if(length==0) {
			for(int i=0; i<gewichte.length; i++){
				System.out.print(gewichte[i]+" - ");
			}
		}// Rekursionsschritt
		else {

			ermittle(gewichte, length-1);
			for(int i=0; i<=length-1; i++){
				{
					vertausche(gewichte, i, length);
					ermittle(gewichte, length-1);
					vertausche(gewichte, i, length);
				}
			}
		}
	}

	private static void vertausche(int[] g, int i, int length) {
		int dummy=g[i];
		g[i]=g[length];
		g[length]=g[dummy];
	}
}
 
Zuletzt bearbeitet:
Hallo.
Hier mal mein Vorschlag hierzu:
Java:
public class Gegengewichte{

    public static void ermittle(int[] gewichte, boolean[] aktiv, int pos){
        if (pos>=gewichte.length) {
            for(int i=0; i<gewichte.length; i++) {
                if(aktiv[i]==true) IO.print(gewichte[i] +" ");
                else System.out.print("_ "); 
            }
            System.out.println();
        }else{
            ermittle(gewichte, aktiv, pos+1);
            aktiv[pos]=true;
            ermittle(gewichte, aktiv, pos+1);
        }
   }

    public static void main(String[] args){
        int[]        gewichte = {22, 6, 4, 18};
        boolean[] aktiv       = new boolean[gewichte.length];
        ermittle(gewichte, aktiv, 0);
    }
}
Hier eine Lösung OHNE 'aktiv[]':
Java:
public class Gegengewichte{

    public static void ermittle(int[] gewichte, int pos){
        if (pos>=gewichte.length) {
            for(int i=0; i<gewichte.length; i++) System.out.print(gewichte[i] +" ");
            System.out.println();
        }else{
            int tmp       = gewichte[pos];
            gewichte[pos] = 0;
            ermittle(gewichte, pos+1);
            gewichte[pos] = tmp;
            ermittle(gewichte, pos+1);
        }
   }

   public static void main(String[] args){
      int[] gewichte = {22, 6, 4, 18};
      ermittle(gewichte, 0);
   }
}
 
Zuletzt bearbeitet:

Zurück
Oben