vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Rekursiv 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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel