Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Rekursion » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Rekursion
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Grisu
unregistriert
Rekursion Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.....
05.12.2013 15:42
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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


__________________
Syntax Highlighting fürs Board (Link)
05.12.2013 19:03 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Grisu
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
05.12.2013 20:45
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

__________________
Syntax Highlighting fürs Board (Link)
06.12.2013 06:12 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Grisu
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
06.12.2013 19:33
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Rekursion