Sie benötigen einen anderen Parameter für den rekursiven Aufruf tun: dass ein Satz von ganzen Zahlen, die Sie bereits gesehen haben. Oder Sie könnten ein BitSet oder gar eine Zeichenfolge verwenden, da Sie auf einzelne Ziffern beschränkt sind.
Zum Weiterleiten des Index können Sie entweder zwei Parameter übergeben, die Zeile und Spalte darstellen, oder Sie können eine div (/) und mod (%) Strategie verwenden, um Zeilen und Spalten aus einem einzigen Indexparameter zu berechnen.
Schließlich könnten Sie ganz von der Notwendigkeit Index loszuwerden, indem man einfach in einem Iterator anstelle eines Arrays vorbei (obwohl die Idee einen Iterator in einen rekursiven Aufruf von vorbei scheint ungerade):
public static int numColors(PrimitiveIterator.OfInt iter, BitSet seen) {
if(!iter.hasNext())
return seen.cardinality();
seen.set(iter.nextInt());
return numColors(iter, seen);
}
public static void main(String[] args) {
int[][] arr = {
{ 1, 5, 4, 3 },
{ 4, 3, 2, 1 },
{ 4, 5, 1, 4 },
{ 1, 4, 3, 2 }};
PrimitiveIterator.OfInt iter = Arrays.stream(arr).flatMapToInt(Arrays::stream).iterator();
System.out.println(numColors(iter, new BitSet()));
}
Und wie gewünscht, hier ist eine „dumme“ -Ansatz:
public class SampleJava {
private static final int MAX_COLORS = 10;
public static int numColors(int[][] arr, int row, int column, int[] seen) {
if(row == arr.length) // end of rows
return 0; // done
if(column == arr[row].length) // end of column
return numColors(arr, row + 1, 0, seen); // advance to next row
seen[arr[row][column]]++; // increment the "seen" count for this color
if(seen[arr[row][column]] == 1) // are we seeing a new color?
return 1 + numColors(arr, row, column + 1, seen); // yes. next column
return 0 + numColors(arr, row, column + 1, seen); // no. next column
}
public static void main(String[] args) {
int[][] arr = {
{ 1, 5, 4, 3 },
{ 4, 3, 2, 1 },
{ 4, 5, 1, 4 },
{ 1, 4, 3, 2 }};
System.out.println(numColors(arr, 0, 0, new int[MAX_COLORS]));
}
}
das ist nicht rekursiv –
Sie haben Recht .... vergaß darüber –
korrigieren Sie mich, wenn ich falsch, das ist kein rekursiver Weg, um dieses Problem zu lösen .. – MarcoPolo