Rekursiv geht meistens schief ...

17/12/2007 - 16:22 von Stefan Anderl | Report spam
aber nicht, wenn man mit VBA programmiert.

Im folgenden eine rekursive Lösung der Türme von Hanoi in Excel-VBA. Der
skeptische Leser möge einmal call_hanoi 14 ausführen, dann das Blatt
"Tabelle1" ausdrucken und es nachspielen. Stoze Besitzer von Excel 2007
können auch höhere Werte eingeben!


Option Explicit

Dim zahl, von, nach, using, zeile As Integer

Sub hanoi(zahl, von, nach, frei, zeile)
If zahl = 1 Then
Debug.Print "Bewege Scheibe von " & von & " nach " & nach
Sheets("Tabelle1").Cells(zeile, 1).Value = von
Sheets("Tabelle1").Cells(zeile, 2).Value = nach
zeile = zeile + 1
Else
hanoi zahl - 1, von, frei, nach, zeile
Debug.Print "Bewege Scheibe von " & von & " nach " & nach
Sheets("Tabelle1").Cells(zeile, 1).Value = von
Sheets("Tabelle1").Cells(zeile, 2).Value = nach
zeile = zeile + 1
hanoi zahl - 1, frei, nach, von, zeile
End If
End Sub

Sub call_hanoi(zahl As Integer)
hanoi zahl, 1, 2, 3, 1
End Sub
 

Lesen sie die antworten

#1 Thomas Ramel
17/12/2007 - 18:37 | Warnen spam
Grüezi Stefan

Stefan Anderl schrieb am 17.12.2007

Rekursive Funktionen klappen recht gut, wenn sie konsequent programmiert
sind. Ein weiteres Beispiel wàre die Berechnung der Fakultàt einer Zahl.

Im folgenden eine rekursive Lösung der Türme von Hanoi in Excel-VBA. Der
skeptische Leser möge einmal call_hanoi 14 ausführen, dann das Blatt
"Tabelle1" ausdrucken und es nachspielen. Stoze Besitzer von Excel 2007
können auch höhere Werte eingeben!



Es dauert, klappt aber soweit.

...ist dennoch ein wenig 'Maöverkritik' erlaubt?

Option Explicit

Dim zahl, von, nach, using, zeile As Integer



Warum deklarierst Du hier die Variablen global im Modul?
Auch bei auskommentierter Zeile làuft der Code reibungslos, da alle
Variablen auf Prozedurebene (nochmals) deklariert werden.

...und Du bist dir bewusst, dass ausser 'Zeile' alle Variablen als
'Variant' deklariert sind?

VBA übernimmt hier nicht die Deklaration für alle Variablen in der Zeile
sondern erwartet sie explizit für jede Variable.


Sub hanoi(zahl, von, nach, frei, zeile)



Hier sind gar alle als Variant übergeben worden.

If zahl = 1 Then
Debug.Print "Bewege Scheibe von " & von & " nach " & nach
Sheets("Tabelle1").Cells(zeile, 1).Value = von
Sheets("Tabelle1").Cells(zeile, 2).Value = nach
zeile = zeile + 1



Das klappt hier, weil 'Zeile' 'Variant' ist - würde die globale Deklaration
greifen wàre in Zeile 32768 Schluss, weil 'Integer' maximal diesen Bereich
umfasst.

Else
hanoi zahl - 1, von, frei, nach, zeile
Debug.Print "Bewege Scheibe von " & von & " nach " & nach
Sheets("Tabelle1").Cells(zeile, 1).Value = von
Sheets("Tabelle1").Cells(zeile, 2).Value = nach
zeile = zeile + 1
hanoi zahl - 1, frei, nach, von, zeile
End If
End Sub

Sub call_hanoi(zahl As Integer)
hanoi zahl, 1, 2, 3, 1
End Sub



Eine ehebliche Beschleunigung der Verarbeitugn könntest Du noch erreichen
indem Du die Werte in ein Array schreibst und dieses erst ganz am Ende auf
einen Schlag ins Tabellenblatt übertràgst.

Meine Kommentare bitte nicht falsch verstehen, ja ;-)


Mit freundlichen Grüssen
Thomas Ramel

- MVP für Microsoft-Excel -
[Win XP Pro SP-2 / xl2003 SP-2]
Microsoft Excel - Die ExpertenTipps

Ähnliche fragen