49 lines
1.3 KiB
Plaintext
49 lines
1.3 KiB
Plaintext
FUNCTION fibonacci (n AS LONG) AS QUAD
|
|
DIM u AS LONG, a AS LONG, L0 AS LONG, outP AS QUAD
|
|
STATIC fibNum() AS QUAD
|
|
|
|
u = UBOUND(fibNum)
|
|
a = ABS(n)
|
|
|
|
IF u < 1 THEN
|
|
REDIM fibNum(1)
|
|
fibNum(1) = 1
|
|
u = 1
|
|
END IF
|
|
|
|
SELECT CASE a
|
|
CASE 0 TO 92
|
|
IF a > u THEN
|
|
REDIM PRESERVE fibNum(a)
|
|
FOR L0 = u + 1 TO a
|
|
fibNum(L0) = fibNum(L0 - 1) + fibNum(L0 - 2)
|
|
IF 88 = L0 THEN fibNum(88) = fibNum(88) + 1
|
|
NEXT
|
|
END IF
|
|
IF n < 0 THEN
|
|
fibonacci = fibNum(a) * ((-1)^(a+1))
|
|
ELSE
|
|
fibonacci = fibNum(a)
|
|
END IF
|
|
CASE ELSE
|
|
'Even without the above-mentioned bug, we're still limited to
|
|
'F(+/-92), due to data type limits. (F(93) = &hA94F AD42 221F 2702)
|
|
ERROR 6
|
|
END SELECT
|
|
END FUNCTION
|
|
|
|
FUNCTION PBMAIN () AS LONG
|
|
DIM n AS LONG
|
|
#IF NOT %DEF(%PB_CC32)
|
|
OPEN "out.txt" FOR OUTPUT AS 1
|
|
#ENDIF
|
|
FOR n = -92 TO 92
|
|
#IF %DEF(%PB_CC32)
|
|
PRINT STR$(n); ": "; FORMAT$(fibonacci(n), "#")
|
|
#ELSE
|
|
PRINT #1, STR$(n) & ": " & FORMAT$(fibonacci(n), "#")
|
|
#ENDIF
|
|
NEXT
|
|
CLOSE
|
|
END FUNCTION
|