| |
VB.NET - FortgeschritteneRekursiv in Iterativ umwandeln | | | Autor: Kuno60 | Datum: 09.05.14 02:15 |
| Hallo,
ich habe ein Problem mit folgendem Programm:
Module Rekursiv
Sub Main()
Dim uhr As New Stopwatch
Console.WriteLine("Berechnung läuft...")
uhr.Start()
Dim erg = Reku1(42, 42)
uhr.Stop()
Console.WriteLine("Ergebnis: {0:n0} Zeit: {1}", erg, uhr.Elapsed)
Console.ReadLine()
'=================================================
'Ausgabe mit Reku1(26, 26):
'--------------------------
'Berechnung läuft...
'Ergebnis: 5.632.870.627 Zeit: 00:00:30.2627623
End Sub
Private Function Reku1(a As Integer, b As Integer) As Long
Return If(a < 1 OrElse b < 1, 1, Reku1(a - 1, b) + Reku2(b - 2, a - 1))
End Function
Private Function Reku2(a As Integer, b As Integer) As Long
Return If(a < 1 OrElse b < 1, 1, Reku1(b, a - 1) + Reku2(a, b - 1))
End Function
End Module Es soll eine Zahl mit Reku1(42, 42) berechnet werden, doch dafür benötigt dieses Programm mehrere Monate.
Bereits mit Reku1(26, 26) benötigt dieses Programm etwa 30 Sekunden (VS 2013, Konsolenanwendung, 64bit, Release, ohne Debugging).
Es muss also eine iterative Lösung gefunden werden. Alle meine Versuche sind bisher fehlgeschlagen.
Wer hat eine Idee, wie man diese Funktionen in eine iterative Lösung umschreiben kann? | |
Re: Rekursiv in Iterativ umwandeln | | | Autor: ErfinderDesRades | Datum: 09.05.14 09:26 |
| ich hab hier eine Lösung mit Cache: Private _RekuCache1(,) As Long
Private _RekuCache2(,) As Long
Sub Main()
Dim uhr As New Stopwatch
Console.WriteLine("Berechnung läuft...")
Dim c = 21
Dim a = c, b = c
uhr.Start()
Dim erg = Reku1(a, b)
uhr.Stop()
Console.WriteLine("Ergebnis: {0} Zeit: {1}", erg, _
uhr.ElapsedMilliseconds)
ReDim _RekuCache1(a, b)
ReDim _RekuCache2(a, b)
uhr.Restart()
erg = Rku1(a, b)
uhr.Stop()
Console.WriteLine("Ergebnis: {0} Zeit: {1}", erg, _
uhr.ElapsedMilliseconds)
'=================================================
'Ausgabe mit Reku1(26, 26):
'--------------------------
'Berechnung läuft...
'Ergebnis: 5.632.870.627 Zeit: 00:00:30.2627623
End Sub
Private Function Rku1(a As Integer, b As Integer) As Long
If a < 1 OrElse b < 1 Then Return 1
If _RekuCache1(a, b) < 1 Then
_RekuCache1(a, b) = If(a < 1 OrElse b < 1, 1, Rku1(a - 1, b) + Rku2(b _
- 2, a - 1))
End If
Return _RekuCache1(a, b)
End Function
Private Function Rku2(a As Integer, b As Integer) As Long
If a < 1 OrElse b < 1 Then Return 1
If _RekuCache2(a, b) < 1 Then
_RekuCache2(a, b) = If(a < 1 OrElse b < 1, 1, Rku1(b, a - 1) + Rku2(a, _
b - 1))
End If
Return _RekuCache2(a, b)
End Function (Rechtschreibfehler urheberrechtlich geschützt) | |
Re: Rekursiv in Iterativ umwandeln | | | Autor: Kuno60 | Datum: 09.05.14 13:34 |
| Hallo ErfinderDesRades,
super Lösung und läuft nur 2 Millisekunden!
Da hätte ich wohl noch ewig dran geknobelt. Man lernt eben nie aus.
Vielen Dank
Kuno | |
Re: Rekursiv in Iterativ umwandeln | | | Autor: us4711 | Datum: 13.05.14 10:50 |
| Oder Du verzichtest auf den unmanaged Code aus dem API, und nutzt die Möglichkeiten der Frameworks, wie oben schon dargestelt.
Bau' Dir eine eigene Klasse, die bei jedem Fund ein Event feuert. Das nimmst Du in Deiner Form auf, und zeigst nach Gusto an.
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|