Artemis.Math : Fibonacci und Fakultät mit Caching v1.01
Übersicht

![]() |
ArtemisBetreff: Artemis.Math : Fibonacci und Fakultät mit Caching v1.01 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ich woanders ein Tutorial über effektives Caching von rekursiven Funktionen gelesen habe, folgt hier mein kleines Modul, welches Fibonacci-Zahlen und die Fakultät einer Zahl Berechnet und gleichzeitig speicher, um es beim nächsten Aufruf schneller zurückgeben zu können.
Informationen zur Installation: Das Modul heißt Artemis.Math und kann entweder über den deutschen Modserver (blitzhelp.net) gesynct oder als zap-Datei heruntergeladen werden. Diese Zap-Datei kann entweder per bmk unzapmod datei.zap oder mit der Batch-Datei unzap.bat, welche mit der Zap-Datei ins Verzeichnis BlitzMax\mod kopiert wird, entpackt werden. Das Modul ist bereits für Windows vorkompiliert. DOWNLOAD: artemis.math.zap Die beiden Funktionen erklären sich von selbst. Und hier ist ein kleiner Geschwindigkeitstests-Code: [AUSKLAPPEN] SuperStrict
Import Artemis.Math ' Anzahl der Durchgänge Const loop_amount:Int = 1000 ' Höchste Zahl (da es ein Byte ist, sowieso nur bis 255) ' ACHTUNG: Fibonacci-Zahlen brauchen ab ca. 30 ziemlich lange Const MAX_ZAHL:Byte = 30 Function Factorial:Int(n:Int) If n < 0 Then Return 0 If n = 0 Then Return 1 If n = 1 Then Return 1 Return Factorial(n-1) * n EndFunction Function Fibonacci:Int(n:Int) If n < 0 Then Return 0 If n = 0 Then Return 0 If n = 1 Then Return 1 Return Fibonacci(n-1) + Fibonacci(n-2) EndFunction Local time_start:Int Local time_end :Int Local loop:Int Local values:Byte[] = New Byte[loop_amount] For loop = 1 To loop_amount values[loop-1] = Rand(0, MAX_ZAHL) Next ' Fakultät ohne Caching time_start = MilliSecs() For loop = 1 To loop_amount Factorial(values[loop-1]) Next time_end = MilliSecs() Print "Fakultaet ohne Caching: "+(time_end-time_start) ' Fakultät mit Caching time_start = MilliSecs() For loop = 1 To loop_amount TMath.Factorial(values[loop-1]) Next time_end = MilliSecs() Print "Fakultaet mit Caching: "+(time_end-time_start) ' Fibonacci ohne Caching time_start = MilliSecs() For loop = 1 To loop_amount Fibonacci(values[loop-1]) Next time_end = MilliSecs() Print "Fibonacci ohne Caching: "+(time_end-time_start) ' Fibonacci mit Caching time_start = MilliSecs() For loop = 1 To loop_amount TMath.Fibonacci(values[loop-1]) Next time_end = MilliSecs() Print "Fibonacci mit Caching: "+(time_end-time_start) |
||
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
So kleines Update.
Habe, da es für Bézierkurven benötigt wird, die Berechnung für Bersteinpolynome und Binomialkoeffizienten hinzugefügt. Download wie schon beschrieben über Modserver oder zap-Datei. Hier auch der Quell-Code: [AUSKLAPPEN] SuperStrict
Rem bbdoc: Math about: Enhält mathematische Funktionen. EndRem Module Artemis.Math ModuleInfo "Version: 1.01" ModuleInfo "Author: Artemis" ModuleInfo "License: Public Domain" ModuleInfo "Modserver: BlitzHelp" ModuleInfo ":" ModuleInfo "History: 1.01" ModuleInfo "History: Hinzugefügt: Funktionen um ein Bersteinpolynom und einen Binomialkoeffizienten zu berechnen." ModuleInfo "History: 1.00 erste Version" Rem bbdoc: Enthält mathematische Funktionen. EndRem Type TMath Global factorial_values:Int[] = [1, 1] Global fibonacci_values:Int[] = [0, 1] Rem bbdoc: Gibt die Fakultät einer Zahl zurück. EndRem Function Factorial:Int(n:Int) If n < 0 Then Return 0 If TMath.factorial_values.length <= n Then TMath.factorial_values = TMath.factorial_values[..n+1] EndIf If TMath.factorial_values[n] = 0 Then TMath.factorial_values[n] = n*TMath.Factorial(n-1) EndIf Return TMath.factorial_values[n] EndFunction Rem bbdoc: Gibt die Fibonacci-Zahl einer Zahl zurück. EndRem Function Fibonacci:Int(n:Int) If n < 0 Then Return 0 If TMath.fibonacci_values.length <= n Then TMath.fibonacci_values = TMath.fibonacci_values[..n+1] EndIf If (TMath.fibonacci_values[n] = 0) And (n > 0) Then TMath.fibonacci_values[n] = TMath.Fibonacci(n-1)+TMath.Fibonacci(n-2) EndIf Return TMath.fibonacci_values[n] EndFunction Rem bbdoc: Berechnet ein Bersteinpolynom. EndRem Function BernsteinPolynomial:Float(i:Int, n:Int, t:Float) Return TMath.BinomialCoefficient(n, i) * (t^i) * ((1-t)^(n-i)) EndFunction Rem bbdoc: Berechnet einen Binomialkoeffizient. EndRem Function BinomialCoefficient:Int(n:Int, k:Int) Return TMath.Factorial(n) / (TMath.Factorial(k)*TMath.Factorial(n-k)) EndFunction EndType |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group