Hm vorsichtig - AutoIt trägt bei Pfadangaben wenn nichts weiter spezifiziert ist nicht das Verzeichnis ein wo das Skript liegt sondern sein Arbeitsverzeichnis (@WorkingDir).
Das ist zwar in den meisten Fällen das gleiche - muss aber nicht - vor allem wenn es explizit mit einem anderen Arbeitsverzeichnis aufgerufen wird.
Daher auch hier dennoch lieber @ScriptDir verwenden.
Beiträge von AspirinJunkie
-
-
-
Hab dir mal einen Ansatz gegeben wo dir vielleicht das Prinzip klarer wird.
Mouseclick kannst du dann selbst draus machen:Spoiler anzeigen
[autoit]Global $Feld[3][2] = [[629, 375],[1005, 373],[1005, 657]]
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To UBound($Feld, 1) - 1
[/autoit]
ConsoleWrite("------ Klick " & $i + 1 & " ---------" & @CRLF)
ConsoleWrite("X-Koordinate: " & $Feld[$i][0] & @CRLF)
ConsoleWrite("Y-Koordinate: " & $Feld[$i][1] & @CRLF & @CRLF)
Next -
Schau dir mal die Funktion Chr() genau an.
Die gibt den Buchstaben entsprechend seiner Position in der ASCII-Tabelle wieder.
Wenn du dir also die ASCII-Tabelle anschaust wirst du sehen das das A an der Stelle 65 steht und Z an der Stelle 90.
Wir müssen also in der Funktion Chr() lediglich eine Zahl zwischen 65 und 90 zufällig eintragen - was ja auch gemacht wird. -
[autoit]
$Bst = Chr(Random(65,90, 1))
[/autoit]?
-
Wenn du es dir noch einfacher machen willst dann kannst du das Dictionary auch automatisch erstellen lassen.
Hab dir mal hier als Beispiel für die gesamte >>Standardklaviatur<< das Dictionary erstellt:Spoiler anzeigen
[autoit]; Frequenzbibliothek initialisieren:
[/autoit] [autoit][/autoit] [autoit]
Global $Toene = _CreateToneTable(440); Tonname definieren:
[/autoit] [autoit][/autoit] [autoit]
$Tonname = "F#5"
; entsprechende Tonfrequenz in Tabelle nachschlagen:
$Frequenz = $Toene($Tonname);Ergebnis ausgeben:
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "", "Tonname: " & $Tonname & @CRLF & "Frequenz: " & $Frequenz)
Beep($Frequenz, 1000); Funktion welche eine Frequenzbibliothek anhand des Kammertones erstellt:
[/autoit] [autoit][/autoit] [autoit]
Func _CreateToneTable($iKammer = 440)
Local $oToene = ObjCreate('Scripting.Dictionary')
If @error Or Not IsObj($oToene) Then Return SetError(1, 0, 0)
Local $aBst = StringSplit("CCDDEFFGGAAB",'')
Local $locKammer, $iFreqFor $x = 0 To 8
[/autoit]
$locKammer = $iKammer * 2 ^ ($x - 4)
For $i = 1 To 12
$iFreq = $locKammer * 2 ^ (($i - 10) / 12)
If $aBst[$i] = $aBst[$i - 1] Then
$oToene.Add($aBst[$i] & '#' & $x, $iFreq)
$oToene.Add($aBst[$i + 1] & 'b' & $x, $iFreq)
Else
$oToene.Add($aBst[$i] & $x, $iFreq)
EndIf
Next
Next
Return $oToene
EndFunc -
wenn es wirklich einfach gehalten werden soll und dennoch mit einer Look-Up-Tabelle gearbeitet werden soll dann schlage ich eher ein Dictionary vor anstatt über Variablennamen zu arbeiten:
Spoiler anzeigen
[autoit]$oToene = ObjCreate('Scripting.Dictionary')
[/autoit] [autoit][/autoit] [autoit]$oToene.Add("a", 440)
[/autoit] [autoit][/autoit] [autoit]
$oToene.Add("a#", 466.16)
$oToene.Add("h", 493.88)
$oToene.Add("c", 523.25)
$oToene.Add("c#", 554.37)
$oToene.Add("d", 587.33)
$oToene.Add("d#", 622.25)
$oToene.Add("e", 659.26)
$oToene.Add("f", 698.46)
$oToene.Add("f#", 739.99)
$oToene.Add("g", 783.99)
$oToene.Add("g#", 830.61)$Frequenz = $oToene("d#")
[/autoit] [autoit][/autoit] [autoit]MsgBox(0,"Beepton", "Die Frequenz von d# ist: " & $Frequenz)
[/autoit] -
[autoit]
If Abs($Zahl1-$Zahl2) < 1 Then
[/autoit] -
Mir ist immer noch nicht klar was er will.
Will er die MAC-Adressen aller physischen Netzwerkadapter?
Wenn ja will er da alle haben egal ob die verbunden sind oder nicht?Weil bei deiner Möglichkeit Bugfix findet er bei mir z.B. nur den Wireless-Controller und den (aktivierten) LAN-Controller nicht weil dieser keine Netzwerkverbindung hat.
Wenn es wirklich direkt um alle physischen Netzwerkadapter geht dann mal hier 2 Möglichkeiten über WMI bzw. über ipconfig:
Spoiler anzeigen
[autoit]#include <array.au3>
[/autoit] [autoit][/autoit] [autoit]$aNetAdapters = _GetMacAdressesWMI()
[/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aNetAdapters)$aNetAdapters = _GetMacAdressesCMD()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_ArrayDisplay($aNetAdapters);---------------------------- Funktionen -----------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
Func _GetMacAdressesWMI()
Local $aReturn[1][2], $bY = FalseIf IsDeclared("oWMI") <> 1 Then
[/autoit] [autoit][/autoit] [autoit]
Local $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")
If @error Or Not IsObj($oWMI) Then Return SetError(1, @error, 0)
EndIf
Local $aItems = $oWMI.ExecQuery("SELECT MACAddress, Name FROM Win32_NetworkAdapter " & _
"WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> " & _
"'Microsoft'))", "WQL", 0x10 + 0x20)If IsObj($aItems) Then
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $x In $aItems
If $bY Then
ReDim $aReturn[UBound($aReturn) + 1][2]
Else
$bY = True
EndIf
$aReturn[UBound($aReturn) - 1][0] = $x.Name
$aReturn[UBound($aReturn) - 1][1] = StringReplace($x.MACAddress, ':', '-')
Next
Return $aReturn
Else
Return SetError(2, 0, 0)
EndIf
EndFuncFunc _GetMacAdressesCMD()
[/autoit] [autoit][/autoit] [autoit]
$sCMD = _GetDOSReturn("ipconfig", "/all")
$aRegExRet = StringRegExp($sCMD, "(?s)[^-](?:Beschreibung|Description)[\.\s]+?:\s([\w\s]+).+?[^-]([0-9A-F]{2}(?:-[0-9A-F]{2}){5})[^-]", 3)
If @error Then
Return SetError(1,@error, '')
Else
Local $aReturn[UBound($aRegExRet)/2][2]For $i=0 To UBound($aReturn)-1
[/autoit] [autoit][/autoit] [autoit]
$aReturn[$i][0] = $aRegExRet[$i*2]
$aReturn[$i][1] = $aRegExRet[$i*2+1]
Next
Return $aReturn
EndIf
EndFuncFunc _GetDOSReturn($sCMD, $sParameter = '')
[/autoit] [autoit][/autoit] [autoit]
Local $sPara = '', $sReturn = '', $sLine
If $sParameter <> '' Then $sPara = ' ' & $sParameter
Local $iPID = Run($sCMD & $sPara, '', @SW_HIDE, 2)While 1
[/autoit] [autoit][/autoit] [autoit]
$sLine = StdoutRead($iPID)
If @error Then ExitLoop
$sReturn &= $sLine
WEndReturn $sReturn
[/autoit]
EndFunc
;------------------------------------------------------------------------------------------------ -
Ne keine Controls - Funktionen.
@Extended ist nichts weiter als eine Möglichkeit zusätzlich zum normalen Rückgabewert Informationen zu hinterlassen.
So wie @error Informationen über mögliche Fehler während der Funktionsausführung informiert kann @extended ebenso Informationen enthalten welche nicht primär in den Rückgabewert gelegt werden sollten.
Das muss die Funktion aber explizit unterstützen.
Ob @extended benutzt wird und welche Information es enthalten wird erfährst du in der Funktionsbeschreibung. -
Kann es sein das es da um Verzweigungen (also mit Else) ging?
Das wär noch logisch.
Ansonsten könnte es daran liegen das Timerdiff nur über eine einzige Ausführung ging?
Da spielen so viele zufällige Faktoren rein das das Messergebnis stark verfälscht wird.
In dem Fall dürfte wohl sogar schon die Ungenauigkeit von TimerInit-Timerdiff selbst darüber liegen:Spoiler anzeigen
[autoit]Global $iN = 100000
[/autoit] [autoit][/autoit] [autoit]
Global $Temp = 0For $i = 1 To $iN
[/autoit] [autoit][/autoit] [autoit]
$Temp += TimerDiff(TimerInit())
NextConsoleWrite("Timerfehler:" & @TAB & Round($Temp / $iN, 5) & " ms" & @CRLF)
[/autoit]
Daher lieber über sehr viele Ausführungen mitteln - das macht das Ergebnis sicherer. -
Mehrzeiliges If > Einzeiliges If
Wo hast du das gelesen?
Versuch es doch mal:Spoiler anzeigen
[autoit]Global $iN = 100000
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $Temp, $iTimer$iTimer = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i=1 To $iN
If mod($i, 2) = 0 Then
$Temp = $i
EndIf
Next
$iTimer = TimerDiff($iTimer)
ConsoleWrite("Mehrzeilig:" & @TAB & round($iTimer/$iN,5) & " ms" & @CRLF)$iTimer = TimerInit()
[/autoit]
For $i=1 To $iN
If mod($i, 2) = 0 Then $Temp = $i
Next
$iTimer = TimerDiff($iTimer)
ConsoleWrite("Einzeilig:" & @TAB & round($iTimer/$iN,5) & " ms" & @CRLF)Bei Fallunterscheidungen per Else-If ist das durchaus richtig und logisch - aber bei einer einfachen If-Abfrage ist das egal ob die Abfrage einzeilig oder mehrzeilig ist.
Mit der Pauschalisierung "mehrzeilig>einzeilig" kann ich also nicht mitgehen.
Mag sein das du das richtige meinst - aber dann schreib vielleicht eher If-Else>If-Then-If-Then.oder sowas.
Neulinge nehmen das schnell für bare Münze und verzichten daher vielleicht auf übersichtlichere einzeilige If-Then wo es gar nicht nötig ist. -
Wenn noch mehr Oktaven oder auch das Halbtondekrement "b" hinzukommt wird es vielleicht bisschen riesig im Code wenn man da wie bisher auf eine Look-Up Table zurückgreift.
Vielleicht wärs eine Möglichkeit die Frequenzen zu berechnen statt zu vorher einzutragen.
Hab dir mal einen Ansatz gebastelt - vielleicht kannst du damit ja etwas anfangen:Spoiler anzeigen
[autoit]_beepton("c",500)
[/autoit] [autoit][/autoit] [autoit]
_beepton("d",500)
_beepton("e",500)
_beepton("f",500)
_beepton("g",1000,2)
_beepton("a2",500,4)
_beepton("g",1500)
_beepton("a2",500,4)
_beepton("g",1500)
_beepton("f",500,4)
_beepton("e",1000,2)
_beepton("d",500,4)
_beepton("c",2000)Func _beepton($v_ton, $i_dauer = 1000, $i_anzahl = 1, $iKammerton = 440)
[/autoit] [autoit][/autoit] [autoit]
Local $iInkr = 0, $cTon = StringLeft($v_ton, 1), $X = -1
Local $iFreq
Local $aToene[7][2] = [["a", 0],["b", 2],["c", 3],["d", 5],["e", 7],["f", 8],["g", 10]]For $i = 0 To 6
[/autoit] [autoit][/autoit] [autoit]
If $cTon = $aToene[$i][0] Then $X = $aToene[$i][1]
Next
If $X = -1 Then Return SetError(1, 0, False)Switch StringLen($v_ton)
[/autoit] [autoit][/autoit] [autoit]
Case 1Case 2
[/autoit] [autoit][/autoit] [autoit]
Switch StringMid($v_ton, 2, 1)
Case '#'
$iInkr = 1
Case 'b'
$iInkr = -1
Case Else
$iKammerton *= 2^(Int(StringMid($v_ton, 2, 1))-1)
EndSwitchCase 3
[/autoit] [autoit][/autoit] [autoit]
$iKammerton *= 2^(Int(StringMid($v_ton, 2, 1))-1)Switch StringMid($v_ton, 3, 1)
[/autoit] [autoit][/autoit] [autoit]
Case '#'
$iInkr = 1
Case 'b'
$iInkr = -1
Case Else
Return SetError(3, 0, False)
EndSwitch
Case Else
Return SetError(2, 0, False)
EndSwitch$iFreq = $iKammerton*(2^(($X+$iInkr)/12))
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To $i_anzahl
[/autoit]
Beep($iFreq,$i_dauer)
Next
EndFunc ;==>_beepton -
Also die Möglichkeit mit der rekursiven Funktion finde ich schon arg umständlich für diesen Fall.
Dafür gibts Schleifen - warum also nicht nehmen?Hab dir mal daher paar Beispiele gemacht wie du auf verschiedene Art und Weise mit Schleifen deinen Fall angehen kannst:
Spoiler anzeigen
[autoit];While-WEnd Schleife:
[/autoit] [autoit][/autoit] [autoit]
While MsgBox(4, "Position 2 Prüfen", "Gewicht auf Pos.3?") <> 6WEnd
[/autoit] [autoit][/autoit] [autoit];While-WEnd EndlosSchleife:
[/autoit] [autoit][/autoit] [autoit]
While True
If MsgBox(4, "Position 2 Prüfen", "Gewicht auf Pos.3?") = 6 Then ExitLoop
WEnd;Do-Until Schleife:
[/autoit] [autoit][/autoit] [autoit]
DoUntil MsgBox(4, "Position 2 Prüfen", "Gewicht auf Pos.3?") = 6
[/autoit] [autoit][/autoit] [autoit];Do-Until EndlosSchleife:
[/autoit] [autoit][/autoit] [autoit]
Do
If MsgBox(4, "Position 2 Prüfen", "Gewicht auf Pos.3?") = 6 Then ExitLoop
Until False;For-Endlosschleife
[/autoit]
For $i=1 To 2 Step 2
If MsgBox(4, "Position 2 Prüfen", "Gewicht auf Pos.3?") = 6 Then ExitLoop
NextWas das Textinfo-Fenster angeht entweder, wie bereits gesagt, eine eigene GUI oder halt mal SplashtextOn ansehen.
-
[autoit]
RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion", "ProductName")
[/autoit]Ansonsten per WMI:
Spoiler anzeigen
[autoit]ConsoleWrite(_GetBSVersion() & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Func _GetBSVersion()
[/autoit] [autoit][/autoit] [autoit]
Local $oWMI = ObjGet("winmgmts:\\localhost\root\CIMV2")For $oI In $oWMI.ExecQuery("SELECT Caption FROM Win32_OperatingSystem", "WQL", 0x10 + 0x20)
[/autoit]
Return $oI.Caption
Next
Return ""
EndFunc -
-
... ohne Worte...
... eigentlich wollte ich ja nur anmerken das der Unterschied nicht der Rekursion geschuldet ist sondern der Berechnung....
.... aber das jetzt sowas hier dabei enstanden ist.... ne....Jungs ich hab ne Menge hierbei gelernt - Danke an ALLE!
-
Jepp so geht es tatsächlich - Dankeschön.
Hier nun der Gesamtvergleich in C++:Spoiler anzeigen
C
Alles anzeigen#include <vector> #include <windows.h> #include <limits.h> using namespace std; unsigned long long fiboRek1(unsigned n){ if (n<=1) return n; return fiboRek1(n-1) + fiboRek1(n-2); } unsigned long long fiboIt(unsigned n){ std::vector<unsigned long long> v; v.push_back(0); v.push_back(1); for (long int i=2; i<=n; i++) v.push_back(v[i-1]+v[i-2]); return v[n]; } unsigned long long fiboRek2(unsigned long long); unsigned long long fiboRek2(unsigned long long, unsigned long long, unsigned long long); unsigned int fiboAsm(int n) { __asm__ ( "movl %0, %%ecx \n\t" "movl $1,%%eax \n\t" "movl $1,%%ebx \n\t" "cmpl $2,%%ecx \n\t" "jbe endek2 \n\t" "subl $2,%%ecx \n\t" "start: \n\t" "addl %%ebx,%%eax \n\t" "movl %%eax,%%edx \n\t" "subl %%ebx,%%edx \n\t" "loop start2 \n\t" "jmp ende \n\t" "start2: \n\t" "addl %%edx,%%eax \n\t" "movl %%eax,%%ebx \n\t" "subl %%edx,%%ebx \n\t" "loop start \n\t" "jmp ende \n\t" "endek2: \n\t" "movl %%ecx,%%eax \n\t" "ende: \n\t" : : "a" (n) ); } int main(){ unsigned i, x, n ; unsigned long long fibo; double T=10000; LARGE_INTEGER lStart, lEnd, lFreq; QueryPerformanceFrequency(&lFreq); printf("\nGr\x94\xE1tes maximal anzeigbares Ergebnis: %21llu\n\n", ULLONG_MAX); printf ("Bis zu welcher Fibonacci-Zahl soll gerechnet werden?: "); scanf ("%d",&n); FILE * outfile = fopen( "FiboOut.txt", "w" ); fprintf(outfile, " x Fib(x)-Rek1 t-Rek1 [ms] Fib(x)-Rek2 t-Rek2 [ms] Fib(x)-It t-It [ms] Fib(x)-Asm t-Asm [ms]"); for(i=0; i<=n;i++){ fprintf(outfile, "\n"); fprintf(outfile, "%5d || ", i); QueryPerformanceCounter(&lStart); fprintf(outfile, "%21llu | ", fiboRek1(i)); QueryPerformanceCounter(&lEnd); fprintf(outfile, "%10d || ", ((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart); QueryPerformanceCounter(&lStart); for( x=0; x<=T; x++) fibo = fiboRek2(i); fprintf(outfile, "%21llu | ", fibo); QueryPerformanceCounter(&lEnd); fprintf(outfile, "%8.5f || ", (((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart)/T); QueryPerformanceCounter(&lStart); for( x=0; x<=T; x++) fibo = fiboIt(i); fprintf(outfile, "%21llu | ", fibo); QueryPerformanceCounter(&lEnd); fprintf(outfile, "%8.5f || ", (((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart)/T); QueryPerformanceCounter(&lStart); for( x=0; x<=T; x++) fibo = fiboAsm(i); fprintf(outfile, "%21llu | ", fibo); QueryPerformanceCounter(&lEnd); fprintf(outfile, "%8.5f || ", (((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart)/T); } return 0; } unsigned long long fiboRek2(unsigned long long n){ if (n < 2) return n; return fiboRek2(1, 1, n); } unsigned long long fiboRek2(unsigned long long a, unsigned long long b, unsigned long long n){ if (n < 3) return b; return fiboRek2(b, a + b, n - 1); }
Um dennoch genauer als eine Millisekunde zu kommen hab ich mich erstmal etwas anders beholfen bis jemand eine bessere Möglichkeit findet.
Laut den jetzigen Ergebnissen ist die Inline-Assembler-Variante klar die schnellste Methode gefolgt von der 2. Rekursionsmethode und dann der iterativen.
Bleibt dennoch das Problem mit der Bereichsüberschreitung ab Fib(47).Hab das zum Testen auch mal bereits kompiliert in den Anhang ... ja "gehangen".
Edit: So hab jetzt die Methoden konsequent auf unsigned long long umgestellt um den Wertebereich so weit wie möglich zu vergrößern.
Außer natürlich bei der Assembler-Methode - die bleibt auf unsigned int (Will mir nicht vorstellen was man da für Kopfstände machen muss um unsigned long long hinzubekommen... )
Heißt bis auf die Assemblermethode kann man mit den anderen bis auf Fib(96) rechnen - dann ist Schluss.
Will man mehr muss man ganz andere, eigene und vor allem langsamere Variablentypen bemühen. (Ähnlich wie bei der bigint.au3) -
Danke - würde ich gerne mal mit testen aber ich nutze minGW als Compiler und der nutzt GAS statt NASM.
Brauche daher den Inline-Code in AT&T-Syntax statt Intel.Habe bisher das als Umbau gemacht:
Spoiler anzeigen
Code
Alles anzeigenunsigned int fiboAsm(int n) { __asm__ ( "movl $n, %ecx \n\t" "movl $1,%eax \n\t" "movl $1,%ebx \n\t" "cmpl $2,%ecx \n\t" "jbe endek2 \n\t" "subl $2,%ecx \n\t" "start: \n\t" "addl %ebx,%eax \n\t" "movl %eax,%edx \n\t" "subl %ebx,%edx \n\t" "loop start2 \n\t" "jmp ende \n\t" "start2: \n\t" "addl %edx,%eax \n\t" "movl %eax,%ebx \n\t" "subl %edx,%ebx \n\t" "loop start \n\t" "jmp ende \n\t" "endek2: \n\t" "movl %ecx,%eax \n\t" "ende: \n\t" ); }
Allerdings gibt der Compiler mir folgende Fehlermeldung:Zitat[Linker error] undefined reference to `n'
Da ich sonst nichts mit Assembler zu tun habe weiß ich auch nicht wie ich die C-Variable n korrekt in den Inline-Assembler-Code integriere. -
@Raptor
Dankeschön - wieder was gelernt: Wusste gar nicht das AutoIt Funktionsüberladung zulässtUEZ
Dem hab ich nichts hinzuzufügen - seh das genausoHab, um die Eingangsfrage zu klären, das ganze mal in C++ gegossen (auch Raptors Methode mit inbegriffen):
Spoiler anzeigen
C
Alles anzeigen#include <fstream> #include <vector> #include <stdio.h> #include <windows.h> using namespace std; unsigned long long fiboRek1(long int n){ if (n<=1) return n; return fiboRek1(n-1) + fiboRek1(n-2); } unsigned long long fiboIt(long int n){ std::vector<long long> v; v.push_back(0); v.push_back(1); for (long int i=2; i<=n; i++) v.push_back(v[i-1]+v[i-2]); return v[n]; } unsigned long long fiboRek2(long int); unsigned long long fiboRek2(long int, long int, long int); int main(){ unsigned i; int n; LARGE_INTEGER lStart, lEnd, lFreq; QueryPerformanceFrequency(&lFreq); printf ("Bis zu welcher Fibonacci-Zahl soll gerechnet werden?: "); scanf ("%d",&n); ofstream out("FiboOut.txt", ios::out); out << "Fib-Zahl Erg_It t_It [ms] Erg_Rek t_Rek [ms] Erg_Rek2 t_Rek2 [ms]"; for(i=0; i<=n;i++){ out << endl; out.width(4); out<<i; QueryPerformanceCounter(&lStart); out.width(30); out<<fiboRek1(i); QueryPerformanceCounter(&lEnd); out << " tRek1="; out.width(6); out << ((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart; QueryPerformanceCounter(&lStart); out.width(30); out << fiboIt(i); QueryPerformanceCounter(&lEnd); out << " tIt="; out.width(6); out << ((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart; QueryPerformanceCounter(&lStart); out.width(30); out << fiboRek2(i); QueryPerformanceCounter(&lEnd); out << " tRek2="; out.width(6); out << ((lEnd.QuadPart - lStart.QuadPart) * 1000) / lFreq.QuadPart;; } return 0; } unsigned long long fiboRek2(long int n){ if (n < 2) return n; return fiboRek2(1, 1, n); } unsigned long long fiboRek2(long int a, long int b, long int n){ if (n < 3) return b; return fiboRek2(b, a + b, n - 1); }
Problem nur dabei: Ich kann mit meiner Methode nur auf Millisekunden genau messen - die iterative und die 2. rekursive Methode sind allerdings schneller...
Erst ab etwa Fib(8000) kann ich bei mir einen Effekt auf die iterative Methode feststellen.
Wenn da noch jemand eine Möglichkeit kennt...
Ach und ab Fib(47) hab ich hab ich bei der 2. Rekursionvariante anscheinend einen Bereichsüberlauf - wem da was auffällt...