Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1816to1820
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Rekursion

Rekursion
02.03.2021 23:13:05
Tobias
Hallo,
Ihr kennt bestimmt diese Rätsel, wo eine Ziffer durch Symbole dargestellt wird und gleiche Symbole die gleiche Ziffer anzeigen. a la (ohne das die Aufgabe jetzt stimmt):
afg - bc = df
- + +
bd + c = fa
= = =
fd + df = ahg
Wenn ich mir jetzt vorstelle, so ein Rätsel mit VBA zu lösen (Brute Force), dann hätte ich bei 10 verschiedenen Symbolen 10 Schleifen die ich durcharbeiten müsste von 0 - 9
Vielleicht habe ich aber auch (andere Probleme) 20 oder mehr Schleifen, die ich erst alle schreiben müsste.
Kann man sowas auch irgendwie über eine rekursive Funktion erstellen? Also eine Funktion mit einer Schleife, die sich selbst aufruft und die nächste "Ebene" abdeckt und in der innersten Schleife frage ich eben, ob alle Bedingungen erfüllt sind; wenn ja - Ende und Anzeige der richtigen Ziffern für die Symbole.
Gruß Tobi@s

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Rekursion
02.03.2021 23:24:41
Daniel
Hi
hier mal ein beispiel für Rekursion.
aus einer gegebenen Gruppe (deine Ziffern 0-9) sollen alle Kombinantionen für eine bestimmte Anzahl von Werten (deine Buchstaben) gebildet werden.
Ausserdem mit einem Beispiel, wie man für die nächste Schleife die bereits benutzten Werte ausschließen kann:
https://www.herber.de/forum/archiv/1816to1820/t1816149.htm#1816337
(müsste sogar noch aktiv sein)
Gruß Daniel

AW: Rekursion
02.03.2021 23:42:49
Yal
Hallo Tobias,
es ist tatsächlich ein Baumstruktur, daher ist Rekursion möglich.
Der Baum hat dann 10 Ebenen:
_ zuerst 10 Möglichkeit die erste Buchstabe auszuwählen (Ebene 1)
_ dann 9 die zweite (Ebene 2)
_ usw
Deine Funktion beinhaltet 2 Parameter:
_ die Liste der verfügbare Buchstaben
_ die Liste allokierte Buchstabe
Die Anzahl der mögliche Kombinationen ist übrigens 10! (10-Fakultät) = 3.628.800 Kombinationen.
Also vergesse nicht den Ausstieg zu ermöglichen, und lege einige DoEvents den Weg entlang, um den Code dazwischen anhalten zu können.
Sub Starte()
Verteile "ABCDEFGHIJ", ""
End Sub
Private Function Verteile(strVerfügbar As String, strAllokiert As String) As Boolean
Dim i
If Len(verfügbar) > 1 Then
For i = 1 To Len(strVerfügbar)
Verteile = Verteile(Replace(strVerfügbar, Mid(strVerfügbar, i, 1), ""),  _
strAllokiert & Mid(strVerfügbar, i, 1))
Next
Else
Verteile = Lösung_auswerten(strAllokiert)
End If
End Function
Private Function Lösung_auswerten(strAllokiert) As Boolean
Dim Lösung As Boolean
Dim arr(9) As String
Dim i
For i = 1 To 10
arr(i - 1) = Mid(strAllokiert, i, 1)
Next
'... Hier findet deine fulminente Lösungsalgorythmus statt
If Lösung Then
MsgBox "lösung gefunden mit" & vbCr & "0123456789" & vbCr & strAllokiert
Lösung_auswerten = True
End If
End Function
Viel Erfolg
Yal

Anzeige
Schade um den Beispiel
03.03.2021 13:36:55
Yal
Hallo Tobias,
das Brute Force ist zwar ein Weg, dass über Rekursion-Einsatz führt (dein Ziel) aber eine mathematische Lösung wäre durchaus schöner. Und vielleicht nicht viel komplizierter.
Aus afg - bc = df müsste man
(100)*a + (10)*f + (1)*g + (-10)*b + (1)*c + (-10)*d + (-1)*f (+(0)*e + (0)*h) = 0
also in a;b;c;..;h-Reihenfolge:
[100;-10;1;-10;0;9;1;0] = 0
machen. Dann das gleich für die 2 weiter horizontale und die 3 vertikale. Dann geht es nur darum die Matrix zu reduzieren.
Es wäre noch zu prüfen, ob es lösbar ist, ohne einen feste Startpunkt zu haben.
Mit fd + df = ahg hätte man a = 1, weil a nicht null sein dürfte und 2 Zahlen unter 100 sich nicht über 198 summieren können.
Auch db + c = fa ergibt aus gleichen Grund f = b + 1
Aber wie bekommen wir diese Logik als Code rein? Das wäre mal eine richtig geile harte Nuss.
Um weiter zu kommen, müsste der Beispiel tauglich sein. Schade, dass es nicht so ist (3. horiz. minus 3. vert. führen zu fa = fd, was widerspricht, dass a und d unterschiedlich sein sollen)
Poste mal einen tauglichen Beispiel, dann legen wir los.
VG
Yal

Anzeige
AW: Schade um den Beispiel
03.03.2021 22:14:36
Tobias
Dass das Beispiel nicht funktioniert steht ja bereits schon in meinem Text:
"a la (ohne das die Aufgabe jetzt stimmt):"
Und das man bei so einer Aufgabe das auch mathematisch versucht lösen zu können, ist mir bewusst.
Es ging mir auch um völlig andere Rätsel (deren Beschreibung jetzt zu weit führen würde; manche Rätsel sind eben bekannter und manche unbekannter) und ich deshalb eine "bekannte" Rätselart genommen habe um zu erklären, was ich meine. Andere haben es zumindest verstanden.
Da beschäftige ich mich zb privat mit dem Rätsel "Slitherlink" für das ich auch schon angefangen habe einen Solver zu schreiben. Auch diesen habe ich mit "Logiken" gefüttert. Jetzt fällt mir keine ein, aber mit BruteForce ... da weiß ich nicht, wie ich das integrieren kann (auch da gibt es Dinge, die man logisch angehen kann dabei - zb wenn man in dem Rätsel "lose Enden" hat, dann such ich mir ein loses Ende, wo nur zwei Wege weg gehen könnten und nicht drei.)
Gruß

Anzeige
AW: Schade um den Beispiel
04.03.2021 00:50:06
Yal
Hallo Tobias,
ich habe es nicht nur verstanden, sondern auch eine funktionierende Rekursionslösung geliefert.
Es ging mir lediglich darum, dass es spassig gewesen wäre, das von dir aufgestellte Problem logisch reinzugehen und hatte keins im i-net auf die Schnelle gefunden. Dass es eigentlich um Slitherlink ging, könnte ich nicht ahnen.
Ich hatte Slitherlink bisher nicht gekannt und sehe, dass ich eher die Finger davon halten sollte: zu hohe Suchtpotenzial (Du siehst die Urzeit). Ich würde die Lösung in Richtung Graph-Algorythmen suchen (https://de.wikipedia.org/wiki/K%C3%B6nigsberger_Br%C3%BCckenproblem ).
Wirf ein Auge auf Neo4j Desktop (GraphDB + UI). Damit habe ich u.a. Sudoku gelöst.
VG
Yal
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige