Sowas wie die Türme von Hanoi iterativ ist schon ekliger als der rekursive Dreizeiler. Allgemein eben, wenn man auf Strukturen wie Bäumen arbeitet, oder bei bestimmten mathematischen Funktionen, die schon so gegeben sind, dass man sie rekursiv "einfach hinschreiben" kann, aber für iterative Form erst... denken müßte ....
public void suche(File f) {
if(f.isDirectory) {
suche(f);
} else {
//durchsuche Datei
}
}
Damit du auch noch ein Beispiel von einer sinnvollen Rekursion bekommst:
Java:public void suche(File f) { if(f.isDirectory) { suche(f); } else { //durchsuche Datei } }
public String suche(File[] f) {
for (File file : f) {
if(file.isDirectory()) {
suche(file.listFiles());
}else{
if(file.getName().equals(zuSuchendeDatei)) {
return file.getAbsolutePath();
}
}
}
return null;
}
Also das hätte ich gern bewiesen. :bae:Der iterative Aufruf darf NIE mit demselben Wert durchgeführt werden, mit dem die Funktion aufgerufen wurde!
Also das hätte ich gern bewiesen. :bae:
public class Test
{
public static void main(String[] args)
{
List<Integer> l = new ArrayList<Integer>();
l.add(3);
l.add(2);
l.add(1);
System.out.println(sum(l));
}
static int sum(List<Integer> l)
{
return l.isEmpty() ? 0 : l.remove(0) + sum(l);
}
}
, bei dir ist der Wert nicht mehr gleich, weil du die Liste veränderst bevor du sie wieder als Parameter nutzt.
public class Recursion {
private static int count;
public static void main(String[] args) {
count = 10;
countDown();
}
private static void countDown() {
if (count-- <= 0)
return;
System.out.println(count);
countDown();
}
}
ohne zu provozieren ein Gegenbeispiel, wobei noch zu interpretieren ist, ob der Wert gleich bleibt,
aber wenn man noch separat verwalteten Zustand miteinbezieht, können auch exakt dieselben Parameter-Werte ok sein,
wobei auch das vielleicht schon eine Verletzung der virtuellen Regel ist
Java:public class Test { public static void main(String[] args) { List<Integer> l = new ArrayList<Integer>(); l.add(3); l.add(2); l.add(1); System.out.println(sum(l)); } static int sum(List<Integer> l) { return l.isEmpty() ? 0 : l.remove(0) + sum(l); } }
static int sum(List<Integer> l) {
System.out.println(l.toString());
if (l.isEmpty()) {
return 0;
} else {
// da wir dzuerst l um ein element Verkürzt und dann sum aufgerufen
// Ich würde mich aber NIE darauf verlassen, dass das auch in der Reihenfolge
// ausgeführt wird bzw audh in Zukunft nie vertauscht wird
// (Zu viele schlechte Erfahrungen!)
return l.remove(0) + sum(l);
}
}
[3, 2, 1]
[2, 1]
[1]
public class Fakultaet {
public static int fakultaet(int i) {
if (i==1) {
return 1;
} else {
return i * fakultaet(i-1);
}
}
public static void main(String[] args) {
int wert = 7;
System.out.println("Fakultät von " + wert + " ist "+ fakultaet(wert));
}
}
Wir sind eben in der objektorientierten Welt, wo es Zustände gibt, die sich nebenher ändern können. Hier also zusätzlich ein Beispiel, in dem sich der "Wert" des Parameters (in diesem Fall nicht mal einer vorhanden) nicht ändert:
Java:public class Recursion { private static int count; public static void main(String[] args) { count = 10; countDown(); } private static void countDown() { if (count-- <= 0) return; System.out.println(count); countDown(); } }
Ich sag nur InduktionMan muss sich nur überlegen, wie das Problem ist, wenn man es um einen Schritt weiter löst.
ich hätte gedacht rekursiv, meine das früher mal so umgesetzt zu haben,SlaterB, Du hast da ein Fraktal gezeigt, das vermutlich mit einem L-System erzeugt wurde. Vom mathematischen Aufbau her hat das ganz klar eine "rekursive Form".
Um so etwas darzustellen geht man aber für gewöhnlich iterativ und vorwärtsgerichtet vor.
Hast Du sowas mal rekursiv gemacht, oder gesehen? Würde mich sehr interessieren.
public class TestGUI extends JFrame {
public TestGUI() {
JPanel p = new JPanel() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
rec(g, 200, 300, Math.PI, 120);
}
private void rec(Graphics g, double x, double y, double direct, int length) {
if (length < 1) return;
double newX = x + Math.sin(direct) * length;
double newY = y + Math.cos(direct) * length;
g.drawLine((int)x, (int)y, (int)newX, (int)newY);
int newL = length * 3 / 5;
rec(g, newX, newY, direct - Math.PI / 4, newL);
rec(g, newX, newY, direct + Math.PI / 4, newL);
}
};
add(p);
setSize(450, 350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new TestGUI();
}
}
Die werden nacheinander aufgerufen, es sind hier also nur 9 Rekursionsstufen.In jedem Schritt erzeugst Du zwei neue Funktionsaufraufe. Das sind dann schon 2^9=512 laufende Funktionen.