Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Rekursion (http://www.informatikerboard.de/board/thread.php?threadid=1727)


Geschrieben von Grisu am 05.12.2013 um 15:42:

  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.....



Geschrieben von eulerscheZahl am 05.12.2013 um 19:03:

 

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 
	*/
}



Geschrieben von Grisu am 05.12.2013 um 20:45:

 

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.



Geschrieben von eulerscheZahl am 06.12.2013 um 06:12:

 

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



Geschrieben von Grisu am 06.12.2013 um 19:33:

 

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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH