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: 4796
Erhaltene Danke: 1059
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: 10183
Erhaltene Danke: 1256
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: 4708
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
|
|