Rekursion

Neue Frage »

Auf diesen Beitrag antworten »
Grisu Rekursion

ich würde gerne folgendes rekursiv schrieben:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public static void array (int[] a){
                 int b=0;
                 for(int i=a.length-1;i>=0;i++){
                       if(i==0){
                                 b=a[0];
                       }
                       else if(a[i]==a[i-1]){
                                 b=0;
                      }
                      else{
                                b=1;
                       }



Die Rekursion muss ja über die Länge des Array stattfinden, das bedeutet ja, dass meine Abbruchbedingung ist a.length=1

Damit kann man ja schon mal beginnen:

if(a.length==1)

Jetzt muss ich in jedem Schritt ja einen Eintrag aus dem Array herausschneiden und das neue kürzere Array als Eingabe für die Methode wählen und dem herausgenommen Wert einen Wert b zuweisen. Und da hapert es an der Umsetzung.....
 
Auf diesen Beitrag antworten »
eulerscheZahl

Gilt immer noch, dass die Funktion void sein soll?
Mein Vorschlag:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
public class Main {

	public static void ablRek(int[] a, int letztesB, int i){
		if(a.length == i) return;
		if (a[i] == 1)
			letztesB = (letztesB + 1) % 2;
		a[i] = letztesB;
		ablRek(a, letztesB, i + 1);
	}
	
	 public static void abl(int[] a){
		ablRek(a, a[0], 1);
	}
	
	public static void main(String[] args) {
		int[] a = {1, 1, 0, 1, 0, 0, 1, 1}; 
		System.out.print("a davor:   ");
		for(int j = 0; j < a.length; j++)
			System.out.print(a[j] + " ");
		abl(a);
		System.out.print("\na danach:  ");
		for(int j = 0; j < a.length; j++)
			System.out.print(a[j] + " ");
	}

	/*
	a davor:   1 1 0 1 0 0 1 1 
	a danach:  1 0 0 1 1 1 0 1 
	*/
}
Auf diesen Beitrag antworten »
Grisu

Okay, das ist die andere Funktion (aus dem anderen Thread)

Hat mir aber dennoch sehr weiter geholfen.

Muss ich bei rekursiver Darstellung Grundsätzlich alle Variablen und Konstante die ich brauche entgegen nehmen?

Wenn sie sich verändern können doch eigentlich schon....

Danke, hat mir sehr geholfen.
Auf diesen Beitrag antworten »
eulerscheZahl

Natürlich musst du alles entgegennehmen, wovon du den Inhalt nicht weiß und nicht (bzw. nicht ohne größeren Aufwand) berechnen kannst.
Ich denke, die Variable letztesB ließe sich noch rekonstruieren, jedoch ist die Übergabe der Variable deutlich einfacher.

Wenn du die Wahl zwischen einer iterativen und einer rekursiven Funktion hast, solltest du die iterative verwenden, da diese schneller ist (weil keine Daten kopiert und an die rekursive Funktion übergeben werden müssen).
Es gibt aber Funktionen die sich nicht oder nur mit großem Aufwand iterativ darstellen lassen.
Ein Beispiel, wo ich Rekursion für sinnvoll halte: ProjectEuler Problem 31
 
Auf diesen Beitrag antworten »
Grisu

Danke noch mal.

Ich fand Rekursionen eigentlich ganz nett, weil sich viele Folgen eins zu eins wie man sie in der Methematik beschreibt umsetzen lassen, jedenfalls wenn sie rekirsiv dargestellt sind.

Mein Problem war hier viel mehr, dass ich mir nicht klar darüber gewesen bin, dass ich die Variablen und Konstanten, die ich benötige in der Methode mit übernehmen muss, ist aber eigentlich ziemlich klar.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »