# Zahlenkombination aus int-array, mit absteigenden Zahlen



## Jagito (6. Nov 2009)

Hallo,
versuche schon seit einigen Tagen folgendes Problem zu lösen, komme aber nicht auf eine Lösung. Auch bisherige Posts waren nicht zielführend. Daher probiere ich das Problem neu zu beschreiben. Sicherlich fällt jemandem eine kreative Lösung ein. 

Ich möchte ein int-array von Zahlen übergeben, also z.B. {3,2,6,4} oder{4,2,3}. Der Algorithmus sollte nun als return Wert mir die arrays zurückgeben, welche aus den Kombinationen entstehen, wenn ich jede Zahl bis 0 runterzählen lasse, also z.B. fürs erste array wäre eine Ausgabe:
3,2,6,4,
2,2,6,4,
1,2,6,4,
0,2,6,4,

3,1,6,4,
2,1,6,4,
1,1,6,4,
0,1,6,4,

3,0,6,4,
...
0,0,0,0

Insgesamt müssten dass 4*3*7*5= 420 Ausgaben sein. 

Hat jemand eine neue Idee oder Implementierung, wie ich dieses Problem angehen kann?


----------



## SlaterB (6. Nov 2009)

Rekursion,

eine Stelle betrachten, z.B. die erste 3, diese bis 0 runter zählen und dann für den Rest die Rekursion aufrufen,
wenn kein Rest vorhanden, dann ist jede der Stellungen 3 bis 0 (mit allem Rest) eine Ausgabe,
ansonsten hat man wieder genau das gleiche: die nächste Stelle bis 0 runter zählen,


die Idee ist einfach, Implementierung schwieriger, alle Daten überall vorhalten, zurücksetzen nach Durchlauf einer TeilRekursion


----------



## DerEisteeTrinker (6. Nov 2009)

man könnte es auch iterativ lösen. erst das int array durchlaufen und bei jedem index ne zweite schleife anfangen, wobei der wert am index den wert zum runterzählen beinhaltet


----------



## Gast (6. Nov 2009)

Hier bietet sich Rekursion förmlich an. Einmal, um die Werte im Array hochzuzählen und einmal, um die entsprechend neuen Werte in die Ergebnismenge einzufügen.


----------



## Jagito (6. Nov 2009)

Danke für eure Tipps bzgl. der rekursiven Methode. Ein Vorschlag, der noch nicht funktioniert, ist folgender. Ich weiß nicht, warum nicht alle Zahlen ausgegeben werden. Hat jemand eine Idee, wie der Code angepasst werden könnte? 


```
static int [] urspr_data = {3,5,4};
/*************/
public static void schleife (int w, int[]data) 
  {
    if (w > data.length-2)
    {
      return;
    }
    else
    {
      if (data[w]!=0)
      {
        data[w] = data[w]-1;
      }
      else
      {
        data[w]=urspr_data[w];
        data[w+1]=data[w+1]-1;
        if(data[w+1]==0){
        	w=w+1;
        }

      }
      berechne(data);
      System.out.println();
      schleife(w, data);
      return;
    }
  }
/************/
  static void berechne(int[] data)
  {
	counter = counter+1;
    for (Integer zahl: data)
    {
      System.out.print(zahl+", ");
     }
  }
```

Und weiter unten als Ausgabe.

```
int[]test = new int[3];
	test[0]=urspr_data[0];
	test[1]=urspr_data[1];
	test[2]=urspr_data[2];
	schleife(0, test);
```
Jan


----------



## SlaterB (6. Nov 2009)

damit es mal vorangeht:

```
public class Test
{
    public static void main(String[] args)
    {
        int[] data = new int[] {3, 5, 4};
        schleife(0, data);
    }


    public static void schleife(int w, int[] data)
    {
        if (w >= data.length)
        {
            berechne(data);
            return;
        }

        int begin = data[w];
        while (data[w] >= 0)
        {
            schleife(w + 1, data);
            data[w]--;
        }
        data[w] = begin;
    }

    static void berechne(int[] data)
    {
        for (int zahl : data)
        {
            System.out.print(zahl + ", ");
        }
        System.out.println();
    }
}
```


----------



## Jagito (6. Nov 2009)

:toll: Das ist die Antwort. Super  Danach hatte ich gesucht. Genial gelöst, SlaterB. Mercy!


----------

