Hallo zusammen!
Meine Aufgabe ist die Implementierung eines Algorithmus, der von Floyd und Bentley entwickelt wurde. Auf StackOverflow wurde er (iterativ) folgendermaßen skizziert:
initialize set S to empty
for J := N-M + 1 to N do
T := RandInt(1, J)
if T is not in S then
insert T in S
else
insert J in S
Ich soll das Ganze nun rekursiv implementieren, was ich so angegangen bin:
{
return sampleRec(s, new ArrayList<T>(), s.size() - k);
}
private static <T> List<T> sampleRec(List<T> s, List<T> newList, int m)
{
if (m < s.size())
{
int random = rnd.nextInt(m);
if (newList.contains(s.get(random)))
{
newList.add(s.get(m));
}
else
{
newList.add(s.get(random));
}
return sampleRec(s, newList, m + 1);
}
return newList;
}```
Jetzt stellt sich mir dabei die Frage, ob das wirklich "rekursiv" ist, und weiterhin, ob das nicht besser geht. Eine andere Lösung sieht so aus:
```private static <T> List<T> sampleRec(List<T> s, int m)
{
List<T> newList;
if (m == s.size())
{
newList = new ArrayList<T>();
}
else
{
newList = sampleRec(s, m + 1);
int random = rnd.nextInt(m);
if (newList.contains(s.get(random)))
{
newList.add(s.get(m));
}
else
{
newList.add(s.get(random));
}
}
return newList;
}
Diese Lösung finde ich aber aus mehreren Gründen irgendwie nicht so prickelnd: Unter anderem, weil das Anlegen der Liste unnötig verkompliziert wird.
Ich wäre also um jeden Tipp dankbar, was sich verbessern lässt, und auch um Argumente, was für die eine Lösung, aber auch für die andere spricht.