Autor |
Beitrag |
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 03.11.15 19:54
Zuletzt bearbeitet von MCKolumfer am Fr 14.10.16 18:20, insgesamt 2-mal bearbeitet
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 03.11.15 21:42
Hallo und
könntest du dein Problem nochmals etwas genauer beschreiben (denn deinen Satz mit den Zahlen verstehe ich nicht)?
|
|
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 04.11.15 17:49
Zuletzt bearbeitet von MCKolumfer am Fr 14.10.16 18:20, insgesamt 1-mal bearbeitet
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mi 04.11.15 18:06
Ich nehme an, dass die natürlichen Zahlen spaeter wie in dem einfachen Beispiel nicht so aussehen.
Also 1, 2, 3, 4, 5 usw.
Sondern vielleicht so: 2, 2, 3, 6 usw.
Das erinnert mich an das "Haus vom Nikolaus" Problem, das ich einmal rekursiv geschrieben habe.
Ich würde hier ein array hernehmen und dann einfach rekursiv durchlaufen.
Wo liegt das Hauptproblem? In der Rekursion oder im Aufbau?
|
|
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 04.11.15 18:17
Ich habe Rekursion noch nie in meinem Leben verwendet. Da die Aufgabenstellung sagt ich soll Rekursion benutzen und damit das Programm schreiben.
Um zu verstehen, wie Rekursion funktioniert möchte ich ersteinmal alle Kombinationsmöglichkeiten von 12345 ausgeben lassen.
|
|
Narses
Beiträge: 10182
Erhaltene Danke: 1255
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 04.11.15 18:24
Moin und im Forum!
MCKolumfer hat folgendes geschrieben : | Ich habe Rekursion noch nie in meinem Leben verwendet.
[...]
Um zu verstehen, wie Rekursion funktioniert |
Hm, an dieser Stelle ist die Aufgabenstellung aber nicht ... "hilfreich"...
Wenn es erstmal um das Verständnis für Rekursion geht, dann empfehle ich dringend die Fakultät und anschließend die Fibonacci-Zahlen rekursiv zu berechnen (das sind jeweils 1-Zeiler, also schnell machbar und - wie ich finde - ausgesprochen hilfreich beim Verstehen von Rekursion).
Dann kannst du dich immer noch an den Permutationen versuchen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
papa69
Beiträge: 79
Erhaltene Danke: 23
Win 10, Ubuntu
C#, Java, C
|
Verfasst: Mi 04.11.15 19:05
Jaja, die Rekursion...
Im Grunde heißt das ja nur, dass sich die Funktion solange selber aufruft, bis sie erfüllt ist.
z.B. (Pseudocode)
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| //irgendwas ... sucheNachbar() { ... wenn ja sucheNachbar(); wenn nein sucheWasAnderes(); } |
_________________ Daniel Bauer
... fatal ist nur, wenn sich das Licht am Ende des Tunnels als entgegenkommender ICE entpuppt ...
|
|
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 04.11.15 19:56
Zuletzt bearbeitet von MCKolumfer am Fr 14.10.16 18:20, insgesamt 1-mal bearbeitet
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mi 04.11.15 20:00
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Tform1.rekursion(tiefe:word); var i:word; begin inc(tiefe); if tiefe<4 then begin for i:=1 to 3 do begin listbox1.items.Add(inttostr(tiefe)); rekursion(tiefe); end; end; end; |
Du startest die procedure mit tiefe(0)
Das ist jetzt eine typische Baumstruktur in rekursiver Darstellung. Eine Rekursion ist eine Prodezur oder eine Funktion die man mehrmals aufruft.
Aber die Baumstruktur ist nicht das was Du für Dein Problem brauchst.
Das heisst im Beispiel von 3 Zahlen: 1,2,3 - 2,1,3 - 3,1,2 (so willst Du es doch haben ??)
Wie Du siehst, brauchst Du nichteinmal eine rekursive Permutation.
Bei der Art von Rekursion muust Du immer Deine erste Zahl rausstreichen.
Das nur mal als Tipp.
|
|
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 04.11.15 20:13
Zuletzt bearbeitet von MCKolumfer am Fr 14.10.16 18:21, insgesamt 1-mal bearbeitet
|
|
gerd8888
Beiträge: 205
Erhaltene Danke: 3
Win7
Delphi 10.1 Starter (kostenlos) Lazarus
|
Verfasst: Mi 04.11.15 21:37
Hallo,
ich habe dich schon richtig verstanden.
Bei 3 Zahlen wären das dann:
1
2
3
1+2 (x)
1+3
2+1 (x)
2+3 (y)
1+2+3
3+2 (y)
Ich hätte schon eine Lösung des Problems, nur will Dein Lehrer auf etwas bestimmtes hinaus. Ich glaube er hat Zwischenwerte gespeichert, die in rekursion(tiefe, var zwischenwerte) aufgerufen werden. Da müsste ich jetzt wirklich selbst nachdenken, wie man das am besten löst.
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 05.11.15 00:02
Ich hab versucht einen möglichen Algorithmus zu beschreiben damit du dich daran üben kannst bin aber dran gescheitert. Code ist einfach soviel sprechender als Umgangssprache
Hier mal ein Beispielalgorithmus der sicher nicht dem entspricht an den dein Lehrer gedacht hat und diverse Mängel hat dir aber vielleicht hilft die ~Idee~ bei Rekursion zu verstehen.
C#-Quelltext 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:
| static void Main(string[] args) { int[] zahlen = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; cmf(10, zahlen); }
private static void cmf(int ziel, int[] zahlen) { cmfRecursive(ziel, zahlen.ToList(), new List<int>()); }
private static void cmfRecursive(int ziel, List<int> zahlen, List<int> solution) { while(zahlen.Count > 0) { var localZiel = ziel - zahlen[0]; var local = zahlen.ToList(); local.RemoveAt(0);
var localSolution = solution.ToList(); localSolution.Add(zahlen[0]);
if (localZiel == 0) Console.WriteLine("Lösung: " + string.Join("+", localSolution)); else if (ziel > 0) cmfRecursive(localZiel, local, localSolution); zahlen.RemoveAt(0); } } |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| --------Ausgabe------ Lösung: 1+2+3+4 Lösung: 1+2+7 Lösung: 1+3+6 Lösung: 1+4+5 Lösung: 1+9 Lösung: 2+3+5 Lösung: 2+8 Lösung: 3+7 Lösung: 4+6 Lösung: 10 |
|
|
MCKolumfer
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 05.11.15 18:01
|
|