VB.NET-Tipp 0132: Rekursive anonyme Funktionen (Lambda-Ausdrücke)
von Dario
Beschreibung
Möchte man in Visual Basic eine anonyme Funktion über einen Lambda-Ausdruck erstellen, so stößt man auf ein Problem: die Funktion kann sich nicht ohne weiteres selber aufrufen, da ihr jeglicher Name fehlt über den sie identifizierbar wäre. Eine interessante Lösung ist hier der Einsatz von sogenannten Fixpunktkombinatoren.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Compact Framework 1.0, .NET Compact Framework 2.0, .NET Framework 4 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008, Visual Basic 2010 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2008 ' Option Strict: An ' Option Explicit: An ' Option Infer: An ' ' Referenzen: ' - System ' - System.Data ' - System.Deployment ' - System.Xml ' - System.Core ' - System.Xml.Linq ' - System.Data.DataSetExtensions ' ' Imports: ' - Microsoft.VisualBasic ' - System ' - System.Collections ' - System.Collections.Generic ' - System.Data ' - System.Diagnostics ' - System.Linq ' - System.Xml.Linq ' ' ############################################################################## ' ################################ Module1.vb ################################## ' ############################################################################## Module Module1 Delegate Function FixedPointFunction(Of TIn, TOut) _ (ByVal f As Func(Of TIn, TOut)) As Func(Of TIn, TOut) Function Fix(Of T, TRes)(ByVal f As FixedPointFunction(Of T, TRes)) _ As Func(Of T, TRes) Return f(Function(x) Fix(f)(x)) End Function Sub Main() Dim Factorial = Fix(Of Integer, Integer) _ (Function(f) Function(x) If(x <= 1, 1, x * f(x - 1))) Dim k = 7 Console.WriteLine("{0}! = {1}", k, Factorial(k)) Console.ReadKey() End Sub End Module
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.