Fibonacci sequence: Difference between revisions

m (Fibonacci sequence page fix highlighting...)
(103 intermediate revisions by 48 users not shown)
Line 38:
 
=={{header|0815}}==
<syntaxhighlight lang="0815">
%<:0D:>~$<:01:~%>=<:a94fad42221f2702:>~>
}:_s:{x{={~$x+%{=>~>x~-x<:0D:~>~>~^:_s:?
Line 46:
{{trans|Python}}
 
<syntaxhighlight lang="11l">F fib_iter(n)
I n < 2
R n
Line 67:
For maximum compatibility, programs use only the basic instruction set.
===using fullword integers===
<syntaxhighlight lang="360asm">* Fibonacci sequence 05/11/2014
* integer (31 bits) = 10 decimals -> max fibo(46)
FIBONACC CSECT
Line 129:
</pre>
===using packed decimals===
<syntaxhighlight lang="360asm">* Fibonacci sequence 31/07/2018
* packed dec (PL8) = 15 decimals => max fibo(73)
FIBOWTOP CSECT
Line 192:
 
The results are calculated and stored, but are not output to the screen or any other physical device: how to do that would depend on the hardware and the operating system.
<syntaxhighlight lang="6502asm"> LDA #0
STA $F0 ; LOWER NUMBER
LDA #1
Line 212:
{{trans|ARM Assembly}}
Input is in D0, and the output is also in D0. There is no protection from 32-bit overflow, so use at your own risk. (I used this [https://godbolt.org/ C compiler] to create this in ARM Assembly and translated it manually into 68000 Assembly. It wasn't that difficult since both CPUs have similar architectures.)
<syntaxhighlight lang="68000devpac">fib:
MOVEM.L D4-D5,-(SP)
MOVE.L D0,D4
Line 235:
=={{header|8080 Assembly}}==
This subroutine expects to be called with the value of <math>n</math> in register <tt>A</tt>, and returns <math>f(n)</math> also in <tt>A</tt>. You may want to take steps to save the previous contents of <tt>B</tt>, <tt>C</tt>, and <tt>D</tt>. The routine only works with fairly small values of <math>n</math>.
<syntaxhighlight lang="8080asm">FIBNCI: MOV C, A ; C will store the counter
DCR C ; decrement, because we know f(1) already
MVI A, 1
Line 245:
JNZ LOOP ; jump if not zero
RET ; return from subroutine</syntaxhighlight>
The range may be easily be extended from the 13th (=233) to the 24th (=46368) Fibonacci number with 16-bit addition using DAD. The code here assumes the CP/M operating system.
<syntaxhighlight>
;-------------------------------------------------------
; useful equates
;-------------------------------------------------------
bdos equ 5 ; BDOS entry
cr equ 13 ; ASCII carriage return
lf equ 10 ; ASCII line feed
space equ 32 ; ASCII space char
conout equ 2 ; BDOS console output function
putstr equ 9 ; BDOS print string function
nterms equ 20 ; number of terms (max=24) to display
;-------------------------------------------------------
; main code begins here
;-------------------------------------------------------
org 100h
lxi h,0 ; save CP/M's stack
dad sp
shld oldstk
lxi sp,stack ; set our own stack
lxi d,signon ; print signon message
mvi c,putstr
call bdos
mvi a,0 ; start with Fib(0)
mloop: push a ; save our count
call fib
call putdec
mvi a,space ; separate the numbers
call putchr
pop a ; get our count back
inr a ; increment it
cpi nterms+1 ; have we reached our limit?
jnz mloop ; no, keep going
lhld oldstk ; all done; get CP/M's stack back
sphl ; restore it
ret ; back to command processor
;-------------------------------------------------------
; calculate nth Fibonacci number (max n = 24)
; entry: A = n
; exit: HL = Fib(n)
;-------------------------------------------------------
fib: mov c,a ; C holds n
lxi d,0 ; DE holds Fib(n-2)
lxi h,1 ; HL holds Fib(n-1)
ana a ; Fib(0) is a special case
jnz fib2 ; n > 0 so calculate normally
xchg ; otherwise return with HL=0
ret
fib2: dcr c
jz fib3 ; we're done
push h ; save Fib(n-1)
dad d ; HL = Fib(n), soon to be Fib(n-1)
pop d ; DE = old F(n-1), now Fib(n-2)
jmp fib2 ; ready for next pass
fib3: ret
;-------------------------------------------------------
; console output of char in A register
;-------------------------------------------------------
putchr: push h
push d
push b
mov e,a
mvi c,conout
call bdos
pop b
pop d
pop h
ret
;---------------------------------------------------------
; Output decimal number to console
; HL holds 16-bit unsigned binary number to print
;---------------------------------------------------------
putdec: push b
push d
push h
lxi b,-10
lxi d,-1
putdec2:
dad b
inx d
jc putdec2
lxi b,10
dad b
xchg
mov a,h
ora l
cnz putdec ; recursive call
mov a,e
adi '0'
call putchr
pop h
pop d
pop b
ret
;-------------------------------------------------------
; data area
;-------------------------------------------------------
signon: db 'Fibonacci number sequence:',cr,lf,'$'
oldstk: dw 0
stack equ $+128 ; 64-level stack
;
end
</syntaxhighlight>
{{out}}
<pre>
Fibonacci number sequence:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
 
=={{header|8086 Assembly}}==
Line 251 ⟶ 359:
 
The max input is 24 before you start having 16-bit overflow.
<syntaxhighlight lang="asm">fib:
; WRITTEN IN C WITH X86-64 CLANG 3.3 AND DOWNGRADED TO 16-BIT X86
; INPUT: DI = THE NUMBER YOU WISH TO CALC THE FIBONACCI NUMBER FOR.
Line 291 ⟶ 399:
 
For the purpose of this example, assume that both this code and the table are in the <code>.CODE</code> segment.
<syntaxhighlight lang="asm">getfib:
;input: BX = the desired fibonacci number (in other words, the "n" in "F(n)")
; DS must point to the segment where the fibonacci table is stored
Line 325 ⟶ 433:
=={{header|8th}}==
An iterative solution:
<syntaxhighlight lang="forth">
: fibon \ n -- fib(n)
>r 0 1
Line 338 ⟶ 446:
=={{header|ABAP}}==
===Iterative===
<syntaxhighlight lang=ABAP"abap">FORM fibonacci_iter USING index TYPE i
CHANGING number_fib TYPE i.
DATA: lv_old type i,
Line 355 ⟶ 463:
===Impure Functional===
{{works with|ABAP|7.4 SP08 Or above only}}
<syntaxhighlight lang=ABAP"abap">cl_demo_output=>display( REDUCE #( INIT fibnm = VALUE stringtab( ( |0| ) ( |1| ) )
n TYPE string
x = `0`
Line 367 ⟶ 475:
=={{header|ACL2}}==
Fast, tail recursive solution:
<syntaxhighlight lang=Lisp"lisp">(defun fast-fib-r (n a b)
(if (or (zp n) (zp (1- n)))
b
Line 393 ⟶ 501:
=={{header|Action!}}==
Action! language does not support recursion. Therefore an iterative approach has been proposed.
<syntaxhighlight lang=Action"action!">INT FUNC Fibonacci(INT n)
INT curr,prev,tmp
 
Line 470 ⟶ 578:
 
=={{header|ActionScript}}==
<syntaxhighlight lang="actionscript">public function fib(n:uint):uint
{
if (n < 2)
Line 481 ⟶ 589:
 
===Recursive===
<syntaxhighlight lang=Ada"ada">with Ada.Text_IO, Ada.Command_Line;
 
procedure Fib is
Line 502 ⟶ 610:
 
===Iterative, build-in integers===
<syntaxhighlight lang="ada">with Ada.Text_IO; use Ada.Text_IO;
 
procedure Test_Fibonacci is
Line 541 ⟶ 649:
Using the big integer implementation from a cryptographic library [https://github.com/cforler/Ada-Crypto-Library/].
 
<syntaxhighlight lang=Ada"ada">with Ada.Text_IO, Ada.Command_Line, Crypto.Types.Big_Numbers;
 
procedure Fibonacci is
Line 581 ⟶ 689:
===Fast method using fast matrix exponentiation===
 
<syntaxhighlight lang=Ada"ada">
with ada.text_io;
use ada.text_io;
Line 634 ⟶ 742:
=={{header|AdvPL}}==
===Recursive===
<syntaxhighlight lang=AdvPL"advpl">
#include "totvs.ch"
User Function fibb(a,b,n)
Line 641 ⟶ 749:
 
===Iterative===
<syntaxhighlight lang=AdvPL"advpl">
#include "totvs.ch"
User Function fibb(n)
Line 651 ⟶ 759:
end while
return(fnext)
</syntaxhighlight>
 
=={{header|Agda}}==
<syntaxhighlight lang="agda">
module FibonacciSequence where
 
open import Data.Nat using (ℕ ; zero ; suc ; _+_)
 
rec_fib : (m : ℕ) -> (a : ℕ) -> (b : ℕ) -> ℕ
rec_fib zero a b = a
rec_fib (suc k) a b = rec_fib k b (a + b)
 
fib : (n : ℕ) -> ℕ
fib n = rec_fib n zero (suc zero)
</syntaxhighlight>
 
=={{header|Aime}}==
<syntaxhighlight lang="aime">integer
fibs(integer n)
{
Line 683 ⟶ 805:
=={{header|ALGOL 60}}==
{{works with|A60}}
<syntaxhighlight lang="algol60">begin
comment Fibonacci sequence;
integer procedure fibonacci(n); value n; integer n;
Line 714 ⟶ 836:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<syntaxhighlight lang="algol68">PROC analytic fibonacci = (LONG INT n)LONG INT:(
LONG REAL sqrt 5 = long sqrt(5);
LONG REAL p = (1 + sqrt 5) / 2;
Line 736 ⟶ 858:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<syntaxhighlight lang="algol68">PROC iterative fibonacci = (INT n)INT:
CASE n+1 IN
0, 1, 1, 2, 3, 5
Line 761 ⟶ 883:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<syntaxhighlight lang="algol68">PROC recursive fibonacci = (INT n)INT:
( n < 2 | n | fib(n-1) + fib(n-2));</syntaxhighlight>
===Generative===
Line 768 ⟶ 890:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<syntaxhighlight lang="algol68">MODE YIELDINT = PROC(INT)VOID;
 
PROC gen fibonacci = (INT n, YIELDINT yield)VOID: (
Line 797 ⟶ 919:
 
This uses a pre-generated list, requiring much less run-time processor usage, but assumes that INT is only 31 bits wide.
<syntaxhighlight lang="algol68">[]INT const fibonacci = []INT( -1836311903, 1134903170,
-701408733, 433494437, -267914296, 165580141, -102334155,
63245986, -39088169, 24157817, -14930352, 9227465, -5702887,
Line 833 ⟶ 955:
 
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
% return the nth Fibonacci number %
integer procedure Fibonacci( integer value n ) ;
Line 860 ⟶ 982:
Note that the 21st Fibonacci number (= 10946) is the largest that can be calculated without overflowing ALGOL-M's integer data type.
====Iterative====
<syntaxhighlight lang="algol">INTEGER FUNCTION FIBONACCI( X ); INTEGER X;
BEGIN
INTEGER M, N, A, I;
Line 875 ⟶ 997:
 
====Naively recursive====
<syntaxhighlight lang="algol">INTEGER FUNCTION FIBONACCI( X ); INTEGER X;
BEGIN
IF X < 3 THEN
Line 885 ⟶ 1,007:
=={{header|Alore}}==
 
<syntaxhighlight lang=Alore"alore">def fib(n as Int) as Int
if n < 2
return 1
Line 894 ⟶ 1,016:
=={{header|Amazing Hopper}}==
Analitic, Recursive and Iterative mode.
<syntaxhighlight lang=Amazing"amazing Hopperhopper">
#include <hbasic.h>
 
Line 947 ⟶ 1,069:
 
=={{header|AntLang}}==
<syntaxhighlight lang=AntLang"antlang">/Sequence
fib:{<0;1> {x,<x[-1]+x[-2]>}/ range[x]}
/nth
Line 954 ⟶ 1,076:
=={{header|Apex}}==
 
<syntaxhighlight lang=Apex"apex">
/*
author: snugsfbay
Line 1,005 ⟶ 1,127:
 
{{works with|Dyalog APL}}
<syntaxhighlight lang=APL"apl">
fib←{⍵≤1:⍵ ⋄ (∇ ⍵-1)+∇ ⍵-2}
</syntaxhighlight>
Line 1,020 ⟶ 1,142:
:<math>\begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix}^n = \begin{pmatrix} F_{n+1} & F_n \\ F_n & F_{n-1} \end{pmatrix}.</math>
In APL:
<syntaxhighlight lang=APL"apl">
↑+.×/N/⊂2 2⍴1 1 1 0
</syntaxhighlight>
Line 1,029 ⟶ 1,151:
The ''First'' removes the shell from the ''Enclose''.
At this point we're basically done, but we need to pick out only <math>F_n</math> in order to complete the task. Here's one way:
<syntaxhighlight lang=APL"apl">
↑0 1↓↑+.×/N/⊂2 2⍴1 1 1 0
</syntaxhighlight>
Line 1,037 ⟶ 1,159:
{{works with|GNU APL}}
An alternative approach, using Binet's formula (which was apparently known long before Binet):
<syntaxhighlight lang="apl">⌊.5+(((1+PHI)÷2)*⍳N)÷PHI←5*.5</syntaxhighlight>
 
=={{header|AppleScript}}==
Line 1,044 ⟶ 1,166:
===Imperative===
 
<syntaxhighlight lang="applescript">set fibs to {}
set x to (text returned of (display dialog "What fibbonaci number do you want?" default answer "3"))
set x to x as integer
Line 1,062 ⟶ 1,184:
The simple recursive version is famously slow:
 
<syntaxhighlight lang=AppleScript"applescript">on fib(n)
if n < 1 then
0
Line 1,076 ⟶ 1,198:
{{Trans|JavaScript}} (ES6 memoized fold example)
{{Trans|Haskell}} (Memoized fold example)
<syntaxhighlight lang=AppleScript"applescript">-------------------- FIBONACCI SEQUENCE --------------------
 
-- fib :: Int -> Int
Line 1,157 ⟶ 1,279:
=={{header|ARM Assembly}}==
Expects to be called with <math>n</math> in R0, and will return <math>f(n)</math> in the same register.
<syntaxhighlight lang="armasm">fibonacci:
push {r1-r3}
mov r1, #0
Line 1,176 ⟶ 1,298:
=={{header|ArnoldC}}==
 
<syntaxhighlight lang=ArnoldC"arnoldc">IT'S SHOWTIME
 
HEY CHRISTMAS TREE f1
Line 1,212 ⟶ 1,334:
===Recursive===
 
<syntaxhighlight lang="arturo">fib: $[x][
if? x<2 [1]
else [(fib x-1) + (fib x-2)]
Line 1,223 ⟶ 1,345:
=={{header|AsciiDots}}==
 
<syntaxhighlight lang=AsciiDots"asciidots">
 
/--#$--\
Line 1,239 ⟶ 1,361:
=={{header|ATS}}==
===Recursive===
<syntaxhighlight lang=ATS"ats">
fun fib_rec(n: int): int =
if n >= 2 then fib_rec(n-1) + fib_rec(n-2) else n
Line 1,245 ⟶ 1,367:
 
===Iterative===
<syntaxhighlight lang=ATS"ats">
(*
** This one is also referred to as being tail-recursive
Line 1,258 ⟶ 1,380:
 
===Iterative and Verified===
<syntaxhighlight lang=ATS"ats">
(*
** This implementation is verified!
Line 1,289 ⟶ 1,411:
 
===Matrix-based===
<syntaxhighlight lang=ATS"ats">
(* ****** ****** *)
//
Line 1,376 ⟶ 1,498:
===Iterative===
{{trans|C}}
<syntaxhighlight lang=AutoHotkey"autohotkey">Loop, 5
MsgBox % fib(A_Index)
Return
Line 1,397 ⟶ 1,519:
===Recursive and iterative===
Source: [http://www.autohotkey.com/forum/topic44657.html AutoHotkey forum] by Laszlo
<syntaxhighlight lang=AutoHotkey"autohotkey">/*
Important note: the recursive version would be very slow
without a global or static array. The iterative version
Line 1,417 ⟶ 1,539:
=={{header|AutoIt}}==
===Iterative===
<syntaxhighlight lang=AutoIt"autoit">#AutoIt Version: 3.2.10.0
$n0 = 0
$n1 = 1
Line 1,446 ⟶ 1,568:
</syntaxhighlight>
===Recursive===
<syntaxhighlight lang=AutoIt"autoit">#AutoIt Version: 3.2.10.0
$n0 = 0
$n1 = 1
Line 1,469 ⟶ 1,591:
=={{header|AWK}}==
As in many examples, this one-liner contains the function as well as testing with input from stdin, output to stdout.
<syntaxhighlight lang="awk">$ awk 'func fib(n){return(n<2?n:fib(n-1)+fib(n-2))}{print "fib("$1")="fib($1)}'
10
fib(10)=55</syntaxhighlight>
Line 1,478 ⟶ 1,600:
 
Iterative solution:
<syntaxhighlight lang="axe">Lbl FIB
r₁→N
0→I
Line 1,493 ⟶ 1,615:
In Babel, we can define fib using a stack-based approach that is not recursive:
 
<syntaxhighlight lang="babel">fib { <- 0 1 { dup <- + -> swap } -> times zap } <</syntaxhighlight>
 
foo x < puts x in foo. In this case, x is the code list between the curly-braces. This is how you define callable code in Babel. The definition works by initializing the stack with 0, 1. On each iteration of the times loop, the function duplicates the top element. In the first iteration, this gives 0, 1, 1. Then it moves down the stack with the <- operator, giving 0, 1 again. It adds, giving 1. then it moves back up the stack, giving 1, 1. Then it swaps. On the next iteration this gives:
Line 1,505 ⟶ 1,627:
And so on. To test fib:
 
<syntaxhighlight lang="babel">{19 iter - fib !} 20 times collect ! lsnum !</syntaxhighlight>
 
{{out}}
Line 1,512 ⟶ 1,634:
=={{header|bash}}==
===Iterative===
<syntaxhighlight lang="bash">
$ fib=1;j=1;while((fib<100));do echo $fib;((k=fib+j,fib=j,j=k));done
</syntaxhighlight>
Line 1,530 ⟶ 1,652:
 
===Recursive===
<syntaxhighlight lang="bash">fib()
{
if [ $1 -le 0 ]
Line 1,556 ⟶ 1,678:
 
==={{header|BASIC256}}===
<syntaxhighlight lang=BASIC256"basic256">
# Basic-256 ver 1.1.4
# iterative Fibonacci sequence
Line 1,582 ⟶ 1,704:
print n + chr(9) + c
</syntaxhighlight>
 
==={{header|BBC BASIC}}===
<syntaxhighlight lang="bbcbasic"> PRINT FNfibonacci_r(1), FNfibonacci_i(1)
PRINT FNfibonacci_r(13), FNfibonacci_i(13)
PRINT FNfibonacci_r(26), FNfibonacci_i(26)
END
DEF FNfibonacci_r(N)
IF N < 2 THEN = N
= FNfibonacci_r(N-1) + FNfibonacci_r(N-2)
DEF FNfibonacci_i(N)
LOCAL F, I, P, T
IF N < 2 THEN = N
P = 1
FOR I = 1 TO N
T = F
F += P
P = T
NEXT
= F
</syntaxhighlight>
{{out}}
<pre> 1 1
233 233
121393 121393</pre>
==={{header|bootBASIC}}===
Variables in bootBASIC are 2 byte unsigned integers that roll over if there is an overflow. Entering a number greater than 24 will result in an incorrect outcome.
<syntaxhighlight lang="BASIC">
10 print "Enter a ";
20 print "number ";
30 print "greater ";
40 print "than 1";
50 print " and less";
60 print " than 25";
70 input z
80 b=1
90 a=0
100 n=2
110 f=a+b
120 a=b
130 b=f
140 n=n+1
150 if n-z-1 goto 110
160 print "The ";
170 print z ;
180 print "th ";
190 print "Fibonacci ";
200 print "Number is ";
210 print f
</syntaxhighlight>
 
==={{header|Chipmunk Basic}}===
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="qbasic">100 cls
110 for i = 0 to 20 : print fibor(i); : next i
120 print
130 for i = 0 to 20 : print fiboi(i); : next i
140 print
150 for i = 0 to 20 : print fiboa(i); : next i
160 end
170 sub fibor(n) : 'Recursive
180 if n < 2 then
190 fibor = n
200 else
210 fibor = fibor(n-1)+fibor(n-2)
220 endif
230 end sub
240 sub fiboi(n) : 'Iterative
250 n1 = 0
260 n2 = 1
270 for k = 1 to abs(n)
280 sum = n1+n2
290 n1 = n2
300 n2 = sum
310 next k
320 if n < 0 then
330 fiboi = n1*((-1)^((-n)+1))
340 else
350 fiboi = n1
360 endif
370 end sub
380 sub fiboa(n) : 'Analytic
390 fiboa = int(0.5+(((sqr 5+1)/2)^n)/sqr 5)
400 end sub</syntaxhighlight>
{{out}}
<pre>0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765</pre>
 
==={{header|Commodore BASIC}}===
<syntaxhighlight lang="basic">100 PRINT CHR$(147); CHR$(18); "**** FIBONACCI GENERATOR ****"
110 INPUT "MIN, MAX"; N1, N2
120 IF N1 > N2 THEN T = N1: N1 = N2: N2 = T
Line 1,609 ⟶ 1,820:
 
READY.</pre>
 
==={{header|Craft Basic}}===
<syntaxhighlight lang="basic">let a = 1
let b = 1
 
print "Fibonacci Sequence"
 
for i = 0 to 20
 
let s = a + b
let a = b
let b = s
 
print s
 
next i</syntaxhighlight>
{{out| Output}}<pre>Fibonacci Sequence
2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 </pre>
 
==={{header|FreeBASIC}}===
Extended sequence coded big integer.
<syntaxhighlight lang="freebasic">'Fibonacci extended
'Freebasic version 24 Windows
Dim Shared ADDQmod(0 To 19) As Ubyte
Dim Shared ADDbool(0 To 19) As Ubyte
 
For z As Integer=0 To 19
ADDQmod(z)=(z Mod 10+48)
ADDbool(z)=(-(10<=z))
Next z
 
Function plusINT(NUM1 As String,NUM2 As String) As String
Dim As Byte flag
#macro finish()
three=Ltrim(three,"0")
If three="" Then Return "0"
If flag=1 Then Swap NUM2,NUM1
Return three
Exit Function
#endmacro
var lenf=Len(NUM1)
var lens=Len(NUM2)
If lens>lenf Then
Swap NUM2,NUM1
Swap lens,lenf
flag=1
End If
var diff=lenf-lens-Sgn(lenf-lens)
var three="0"+NUM1
var two=String(lenf-lens,"0")+NUM2
Dim As Integer n2
Dim As Ubyte addup,addcarry
addcarry=0
For n2=lenf-1 To diff Step -1
addup=two[n2]+NUM1[n2]-96
three[n2+1]=addQmod(addup+addcarry)
addcarry=addbool(addup+addcarry)
Next n2
If addcarry=0 Then
finish()
End If
If n2=-1 Then
three[0]=addcarry+48
finish()
End If
For n2=n2 To 0 Step -1
addup=two[n2]+NUM1[n2]-96
three[n2+1]=addQmod(addup+addcarry)
addcarry=addbool(addup+addcarry)
Next n2
three[0]=addcarry+48
finish()
End Function
 
Function fibonacci(n As Integer) As String
Dim As String sl,l,term
sl="0": l="1"
If n=1 Then Return "0"
If n=2 Then Return "1"
n=n-2
For x As Integer= 1 To n
term=plusINT(l,sl)
sl=l
l=term
Next x
Function =term
End Function
 
'============== EXAMPLE ===============
print "THE SEQUENCE TO 10:"
print
For n As Integer=1 To 10
Print "term";n;": "; fibonacci(n)
Next n
print
print "Selected Fibonacci number"
print "Fibonacci 500"
print
print fibonacci(500)
Sleep</syntaxhighlight>
{{out}}
<pre>THE SEQUENCE TO 10:
 
term 1: 0
term 2: 1
term 3: 1
term 4: 2
term 5: 3
term 6: 5
term 7: 8
term 8: 13
term 9: 21
term 10: 34
 
Selected Fibonacci number
Fibonacci 500
 
86168291600238450732788312165664788095941068326060883324529903470149056115823592
713458328176574447204501</pre>
 
==={{header|FTCBASIC}}===
<syntaxhighlight lang="basic">define a = 1, b = 1, s = 0, i = 0
 
cls
 
print "Fibonacci Sequence"
 
do
 
let s = a + b
let a = b
let b = s
+1 i
 
print s
 
loop i < 20
 
pause
end</syntaxhighlight>
 
 
==={{header|GFA Basic}}===
<syntaxhighlight lang="text">
'
' Compute nth Fibonacci number
'
' open a window for display
OPENW 1
CLEARW 1
' Display some fibonacci numbers
' Fib(46) is the largest number GFA Basic can reach
' (long integers are 4 bytes)
FOR i%=0 TO 46
PRINT "fib(";i%;")=";@fib(i%)
NEXT i%
' wait for a key press and tidy up
~INP(2)
CLOSEW 1
'
' Function to compute nth fibonacci number
' n must be in range 0 to 46, inclusive
'
FUNCTION fib(n%)
LOCAL n0%,n1%,nn%,i%
n0%=0
n1%=1
SELECT n%
CASE 0
RETURN n0%
CASE 1
RETURN n1%
DEFAULT
FOR i%=2 TO n%
nn%=n0%+n1%
n0%=n1%
n1%=nn%
NEXT i%
RETURN nn%
ENDSELECT
ENDFUNC
</syntaxhighlight>
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
====Iterative====
<syntaxhighlight lang="gwbasic">
10 ' SAVE"FIBONA", A
20 ' Secuencia de Fibonacci
30 ' Var
40 DEFDBL D
50 IMAXFIBO% = 76
60 DNUM1 = 1: DNUM2 = DNUM1
70 CLS
80 PRINT "Este programa calcula la serie de Fibonacci."
90 PRINT DNUM1; DNUM2;
100 FOR I% = 1 TO IMAXFIBO%
110 DNUM3 = DNUM1 + DNUM2
120 PRINT DNUM3;
130 DNUM1 = DNUM2: DNUM2 = DNUM3
140 NEXT I%
150 PRINT
160 PRINT "Fin de la ejecución del programa."
170 END
</syntaxhighlight>
{{out}}
<pre>
Este programa calcula la serie de Fibonacci.
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584
4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229
832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817
39088169 63245986 102334155 165580141 267914296 433494437 701408733
1134903170 1836311903 2971215073 4807526976 7778742049 12586269025
20365011074 32951280099 53316291173 86267571272 139583862445 225851433717
365435296162 591286729879 956722026041 1548008755920 2504730781961
4052739537881 6557470319842 10610209857723 17167680177565 27777890035288
44945570212853 72723460248141 117669030460994 190392490709135
308061521170129 498454011879264 806515533049393 1304969544928657
2111485077978050 3416454622906707 5527939700884757 8944394323791464
Fin de la ejecución del programa.
Ok
</pre>
 
====Binet formula====
<syntaxhighlight lang="gwbasic">
10 ' SAVE"FIBINF", A
20 ' Secuencia de Fibonacci mediante la fórmula de Binet
30 ' Var
40 DEFDBL D
50 IMAXFIBO% = 77
60 DSQR5 = SQR(5)
70 DPIV1 = (1 + DSQR5) / 2
80 DPIV2 = (1 - DSQR5) / 2
90 DNUM1 = DPIV1: DNUM2 = DPIV2
100 CLS
110 PRINT "Este programa calcula la serie de Fibonacci."
120 FOR I% = 1 TO IMAXFIBO%
130 DNUM1 = DNUM1 * DPIV1
140 DNUM2 = DNUM2 * DPIV2
150 PRINT FIX(((DNUM1 - DNUM2) / DSQR5)+.5);
160 NEXT I%
170 PRINT
180 PRINT "Fin de la ejecución del programa."
190 END
</syntaxhighlight>
{{out}}
<pre>
Este programa calcula la serie de Fibonacci.
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
6765 10946 17711 28657 46368 75025 121393 196418 317811 514229
832040 1346269 2178310 3524579 5702889 9227468 14930357 24157826
39088183 63246010 102334195 165580207 267914406 433494620 701409036
1134903671 1836312733 2971216446 4807529247 7778745802 12586275225
20365021312 32951296999 53316319058 86267617266 139583938281 225851558714
365435502118 591287069122 956722584654 1548009675479 2504732295250
4052742027550 6557474414738 10610216591046 17167691246479 27777908226979
44945600103607 72723509350188 117669111103547 190392623123089
308061738545741 498454368657289 806516118510594 1304970505463907
2111486653578091 3416457206941612 5527943938022908 8944401270367342
Fin de la ejecución del programa.
Ok 
</pre>
 
==={{header|Integer BASIC}}===
Only works with quite small values of <math>n</math>.
<syntaxhighlight lang="basic"> 10 INPUT N
20 A=0
30 B=1
Line 1,624 ⟶ 2,101:
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang=IS"is-BASICbasic">100 PROGRAM "Fibonac.bas"
110 FOR I=0 TO 20
120 PRINT "F";I,FIB(I)
Line 1,636 ⟶ 2,113:
200 LET FIB=A
210 END DEF</syntaxhighlight>
 
==={{header|Liberty BASIC}}===
====Iterative/Recursive====
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">
for i = 0 to 15
print fiboR(i),fiboI(i)
next i
function fiboR(n)
if n <= 1 then
fiboR = n
else
fiboR = fiboR(n-1) + fiboR(n-2)
end if
end function
function fiboI(n)
a = 0
b = 1
for i = 1 to n
temp = a + b
a = b
b = temp
next i
fiboI = a
end function
</syntaxhighlight>
{{out}}
<pre>
0 0
1 1
1 1
2 2
3 3
5 5
8 8
13 13
21 21
34 34
55 55
89 89
144 144
233 233
377 377
610 610
</pre>
====Iterative/Negative====
{{works with|Just BASIC}}
<syntaxhighlight lang="lb">
print "Rosetta Code - Fibonacci sequence": print
print " n Fn"
for x=-12 to 12 '68 max
print using("### ", x); using("##############", FibonacciTerm(x))
next x
print
[start]
input "Enter a term#: "; n$
n$=lower$(trim$(n$))
if n$="" then print "Program complete.": end
print FibonacciTerm(val(n$))
goto [start]
 
function FibonacciTerm(n)
n=int(n)
FTa=0: FTb=1: FTc=-1
select case
case n=0 : FibonacciTerm=0 : exit function
case n=1 : FibonacciTerm=1 : exit function
case n=-1 : FibonacciTerm=-1 : exit function
case n>1
for x=2 to n
FibonacciTerm=FTa+FTb
FTa=FTb: FTb=FibonacciTerm
next x
exit function
case n<-1
for x=-2 to n step -1
FibonacciTerm=FTa+FTc
FTa=FTc: FTc=FibonacciTerm
next x
exit function
end select
end function
</syntaxhighlight>
{{out}}
<pre>
Rosetta Code - Fibonacci sequence
 
n Fn
-12 -144
-11 -89
-10 -55
-9 -34
-8 -21
-7 -13
-6 -8
-5 -5
-4 -3
-3 -2
-2 -1
-1 -1
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
 
Enter a term#: 12
144
Enter a term#:
Program complete.
</pre>
 
==={{header|Microsoft Small Basic}}===
====Iterative====
<syntaxhighlight lang="smallbasic">' Fibonacci sequence - 31/07/2018
n = 139
f1 = 0
f2 = 1
TextWindow.WriteLine("fibo(0)="+f1)
TextWindow.WriteLine("fibo(1)="+f2)
For i = 2 To n
f3 = f1 + f2
TextWindow.WriteLine("fibo("+i+")="+f3)
f1 = f2
f2 = f3
EndFor</syntaxhighlight>
{{out}}
<pre>
fibo(139)=50095301248058391139327916261
</pre>
====Binet's Formula====
<syntaxhighlight lang="smallbasic">' Fibonacci sequence - Binet's Formula - 31/07/2018
n = 69
sq5=Math.SquareRoot(5)
phi1=(1+sq5)/2
phi2=(1-sq5)/2
phi1n=phi1
phi2n=phi2
For i = 2 To n
phi1n=phi1n*phi1
phi2n=phi2n*phi2
TextWindow.Write(Math.Floor((phi1n-phi2n)/sq5)+" ")
EndFor</syntaxhighlight>
{{out}}
<pre>
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994
</pre>
 
==={{header|Minimal BASIC}}===
{{works with|QBasic}}
{{works with|BASICA}}
{{works with|Chipmunk Basic}}
{{works with|GW-BASIC}}
{{works with|IS-BASIC}}
{{works with|MSX Basic}}
<syntaxhighlight lang="qbasic">110 REM THE ARRAY F HOLDS THE FIBONACCI NUMBERS
120 DIM F(22)
130 LET F(0) = 0
140 LET F(1) = 1
150 LET N = 1
160 REM COMPUTE THE NEXT FIBBONACCI NUMBER
170 LET F(N+1) = F(N)+F(N-1)
180 LET N = N+1
190 PRINT F(N-2);
200 REM STOP AFTER PRINTING 20 NUMBERS
210 IF N < 22 THEN 170
220 END</syntaxhighlight>
 
==={{header|MSX Basic}}===
{{works with|QBasic}}
{{works with|Chipmunk Basic}}
{{works with|GW-BASIC}}
<syntaxhighlight lang="qbasic">100 CLS
110 FOR N = 0 TO 15: GOSUB 130: PRINT FIBOI; : NEXT N
120 END
130 REM Iterative Fibonacci sequence
140 N1 = 0
150 N2 = 1
160 FOR K = 1 TO ABS(N)
170 SUM = N1 + N2
180 N1 = N2
190 N2 = SUM
200 NEXT K
210 IF N < 0 THEN FIBOI = N1 * ((-1) ^ ((-N) + 1)) ELSE FIBOI = N1
220 RETURN</syntaxhighlight>
 
==={{header|Palo Alto Tiny BASIC}}===
<syntaxhighlight lang="basic">
10 REM FIBONACCI SEQUENCE
20 INPUT "ENTER N FOR FIB(N)"N
30 LET A=0,B=1
40 FOR I=2 TO N
50 LET T=B,B=A+B,A=T
60 NEXT I
70 PRINT B
80 STOP
</syntaxhighlight>
{{out}}
2 runs.
<pre>
ENTER N FOR FIB(N):9
34
</pre>
<pre>
ENTER N FOR FIB(N):13
233
</pre>
 
==={{header|PowerBASIC}}===
{{trans|BASIC}}
There seems to be a limitation (dare I say, bug?) in PowerBASIC regarding how large numbers are stored. 10E17 and larger get rounded to the nearest 10. For F(n), where ABS(n) > 87, is affected like this:
actual: displayed:
F(88) 1100087778366101931 1100087778366101930
F(89) 1779979416004714189 1779979416004714190
F(90) 2880067194370816120 2880067194370816120
F(91) 4660046610375530309 4660046610375530310
F(92) 7540113804746346429 7540113804746346430
 
<syntaxhighlight lang="powerbasic">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</syntaxhighlight>
 
==={{header|PureBasic}}===
====Macro based calculation====
<syntaxhighlight lang="purebasic">Macro Fibonacci (n)
Int((Pow(((1+Sqr(5))/2),n)-Pow(((1-Sqr(5))/2),n))/Sqr(5))
EndMacro</syntaxhighlight>
====Recursive====
<syntaxhighlight lang="purebasic">Procedure FibonacciReq(n)
If n<2
ProcedureReturn n
Else
ProcedureReturn FibonacciReq(n-1)+FibonacciReq(n-2)
EndIf
EndProcedure</syntaxhighlight>
 
====Recursive & optimized with a static hash table====
This will be much faster on larger n's, this as it uses a table to store known parts instead of recalculating them.
On my machine the speedup compares to above code is
Fib(n) Speedup
20 2
25 23
30 217
40 25847
46 1156741
<syntaxhighlight lang="purebasic">Procedure Fibonacci(n)
Static NewMap Fib.i()
Protected FirstRecursion
If MapSize(Fib())= 0 ; Init the hash table the first run
Fib("0")=0: Fib("1")=1
FirstRecursion = #True
EndIf
If n >= 2
Protected.s s=Str(n)
If Not FindMapElement(Fib(),s) ; Calculate only needed parts
Fib(s)= Fibonacci(n-1)+Fibonacci(n-2)
EndIf
n = Fib(s)
EndIf
If FirstRecursion ; Free the memory when finalizing the first call
ClearMap(Fib())
EndIf
ProcedureReturn n
EndProcedure</syntaxhighlight>
 
'''Example'''
Fibonacci(0)= 0
Fibonacci(1)= 1
Fibonacci(2)= 1
Fibonacci(3)= 2
Fibonacci(4)= 3
Fibonacci(5)= 5
FibonacciReq(0)= 0
FibonacciReq(1)= 1
FibonacciReq(2)= 1
FibonacciReq(3)= 2
FibonacciReq(4)= 3
FibonacciReq(5)= 5
 
==={{header|QB64}}===
''CBTJD'': 2020/03/13
<syntaxhighlight lang="qbasic">_DEFINE F AS _UNSIGNED _INTEGER64
CLS
PRINT
PRINT "Enter 40 to more easily see the difference in calculation speeds."
PRINT
INPUT "Enter n for Fibonacci(n): ", n
PRINT
PRINT " Analytic Method (Fastest): F("; LTRIM$(STR$(n)); ") ="; fA(n)
PRINT "Iterative Method (Fast): F("; LTRIM$(STR$(n)); ") ="; fI(n)
PRINT "Recursive Method (Slow): F("; LTRIM$(STR$(n)); ") ="; fR(n)
END
 
' === Analytic Fibonacci Function (Fastest)
FUNCTION fA (n)
fA = INT(0.5 + (((SQR(5) + 1) / 2) ^ n) / SQR(5))
END FUNCTION
 
' === Iterative Fibonacci Function (Fast)
FUNCTION fI (n)
FOR i = 1 TO n
IF i < 3 THEN a = 1: b = 1
t = fI + b: fI = b: b = t
NEXT
END FUNCTION
 
' === Recursive Fibonacci function (Slow)
FUNCTION fR (n)
IF n <= 1 THEN
fR = n
ELSE
fR = fR(n - 1) + fR(n - 2)
END IF
END FUNCTION
</syntaxhighlight>
Fibonacci from Russia
<syntaxhighlight lang="qbasic">DIM F(80) AS DOUBLE 'FibRus.bas DANILIN
F(1) = 0: F(2) = 1
'OPEN "FibRus.txt" FOR OUTPUT AS #1
FOR i = 3 TO 80
F(i) = F(i-1)+F(i-2)
NEXT i
 
FOR i = 1 TO 80
f$ = STR$(F(i)): LF = 22 - LEN(f$)
n$ = ""
FOR j = 1 TO LF: n$ = " " + n$: NEXT
f$ = n$ + f$
PRINT i, f$: ' PRINT #1, i, f$
NEXT i</syntaxhighlight>
{{out}}
<pre>1 0
2 1
3 1
4 2
5 3
6 5
7 8
8 13
9 21
...
24 28657
25 46368
26 75025
...
36 9227465
37 14930352
38 24157817
...
48 2971215073
49 4807526976
50 7778742049
...
60 956722026041
61 1548008755920
62 2504730781961
...
76 2111485077978050
77 3416454622906707
78 5527939700884757
79 8944394323791464
80 1.447233402467622D+16</pre>
 
==={{header|QBasic}}===
Line 1,641 ⟶ 2,538:
{{works with|FreeBASIC}}
====Iterative====
<syntaxhighlight lang="qbasic">FUNCTION itFib (n)
n1 = 0
n2 = 1
Line 1,658 ⟶ 2,555:
Next version calculates each value once, as needed, and stores the results in an array for later retreival (due to the use of <code>REDIM PRESERVE</code>, it requires [[QuickBASIC]] 4.5 or newer):
 
<syntaxhighlight lang="qbasic">DECLARE FUNCTION fibonacci& (n AS INTEGER)
 
REDIM SHARED fibNum(1) AS LONG
Line 1,706 ⟶ 2,603:
====Recursive====
This example can't handle n < 0.
<syntaxhighlight lang="qbasic">FUNCTION recFib (n)
 
<syntaxhighlight lang=qbasic>FUNCTION recFib (n)
IF (n < 2) THEN
recFib = n
Line 1,716 ⟶ 2,612:
 
====Array (Table) Lookup====
 
This uses a pre-generated list, requiring much less run-time processor usage. (Since the sequence never changes, this is probably the best way to do this in "the real world". The same applies to other sequences like prime numbers, and numbers like pi and e.)
 
<syntaxhighlight lang="qbasic">DATA -1836311903,1134903170,-701408733,433494437,-267914296,165580141,-102334155
DATA 63245986,-39088169,24157817,-14930352,9227465,-5702887,3524578,-2178309
DATA 1346269,-832040,514229,-317811,196418,-121393,75025,-46368,28657,-17711
Line 1,741 ⟶ 2,636:
'*****sample inputs*****</syntaxhighlight>
 
===={{header|QB64Quite BASIC}}====
<syntaxhighlight lang="qbasic">100 CLS
110 rem The array F holds the Fibonacci numbers
120 ARRAY f : rem DIM f(22) para Quite BASIC and MSX-BASIC
130 LET f(0) = 0
140 LET f(1) = 1
150 LET n = 1
160 rem Compute the NEXT Fibbonacci number
170 LET f(n+1) = f(n)+f(n-1)
180 LET n = n+1
190 PRINT f(n-2);" ";
200 rem STOP after printing 20 numbers
210 IF n < 22 THEN GOTO 170</syntaxhighlight>
 
==={{header|Run BASIC}}===
Fibonacci from Russia
<syntaxhighlight lang="runbasic">for i = 0 to 10
print i;" ";fibR(i);" ";fibI(i)
next i
end
function fibR(n)
if n < 2 then fibR = n else fibR = fibR(n-1) + fibR(n-2)
end function
function fibI(n)
b = 1
for i = 1 to n
t = a + b
a = b
b = t
next i
fibI = a
end function</syntaxhighlight>
 
==={{header|S-BASIC}}===
<syntaxhighlight lang=qbasic>DIM F(80) AS DOUBLE 'FibRus.bas DANILIN
Note that the 23rd Fibonacci number (=28657) is the largest that can be generated without overflowing S-BASIC's integer data type.
F(1) = 0: F(2) = 1
<syntaxhighlight lang="basic">
'OPEN "FibRus.txt" FOR OUTPUT AS #1
rem - iterative function to calculate nth fibonacci number
FOR i = 3 TO 80
function fibonacci(n = integer) = integer
F(i) = F(i-1)+F(i-2)
var f, i, p1, p2 = integer
NEXT i
p1 = 0
p2 = 1
if n = 0 then
f = 0
else
for i = 1 to n
f = p1 + p2
p2 = p1
p1 = f
next i
end = f
 
rem - exercise the function
FOR i = 1 TO 80
var i = integer
f$ = STR$(F(i)): LF = 22 - LEN(f$)
for i = 0 n$ =to ""10
print fibonacci(i);
FOR j = 1 TO LF: n$ = " " + n$: NEXT
next i
f$ = n$ + f$
 
PRINT i, f$: ' PRINT #1, i, f$
end
NEXT i</syntaxhighlight>
</syntaxhighlight>
{{out}}
<pre>1 0 1 1 2 3 5 8 13 21 34 055
</pre>
2 1
3 1
4 2
5 3
6 5
7 8
8 13
9 21
...
24 28657
25 46368
26 75025
...
36 9227465
37 14930352
38 24157817
...
48 2971215073
49 4807526976
50 7778742049
...
60 956722026041
61 1548008755920
62 2504730781961
...
76 2111485077978050
77 3416454622906707
78 5527939700884757
79 8944394323791464
80 1.447233402467622D+16</pre>
 
==={{header|Sinclair ZX81 BASIC}}===
====Analytic====
<syntaxhighlight lang="basic"> 10 INPUT N
20 PRINT INT (0.5+(((SQR 5+1)/2)**N)/SQR 5)</syntaxhighlight>
 
====Iterative====
<syntaxhighlight lang="basic"> 10 INPUT N
20 LET A=0
30 LET B=1
Line 1,809 ⟶ 2,717:
 
====Tail recursive====
<syntaxhighlight lang="basic"> 10 INPUT N
20 LET A=0
30 LET B=1
Line 1,822 ⟶ 2,730:
120 GOSUB 70
130 RETURN</syntaxhighlight>
 
==={{header|smart BASIC}}===
 
The Iterative method is slow (relatively) and the Recursive method doubly so since it references the recursion function twice.
 
The N-th Term (fibN) function is much faster as it utilizes Binet's Formula.
 
<ul>
<li>fibR: Fibonacci Recursive</li>
<li>fibI: Fibonacci Iterative</li>
<li>fibN: Fibonacci N-th Term</li>
</ul>
 
<syntaxhighlight lang="qbasic">FOR i = 0 TO 15
PRINT fibR(i),fibI(i),fibN(i)
NEXT i
 
/* Recursive Method */
DEF fibR(n)
IF n <= 1 THEN
fibR = n
ELSE
fibR = fibR(n-1) + fibR(n-2)
ENDIF
END DEF
 
/* Iterative Method */
DEF fibI(n)
a = 0
b = 1
FOR i = 1 TO n
temp = a + b
a = b
b = temp
NEXT i
fibI = a
END DEF
 
/* N-th Term Method */
DEF fibN(n)
uphi = .5 + SQR(5)/2
lphi = .5 - SQR(5)/2
fibN = (uphi^n-lphi^n)/SQR(5)
END DEF</syntaxhighlight>
 
==={{header|Softbridge BASIC}}===
====Iterative====
<syntaxhighlight lang="basic">
Function Fibonacci(n)
x = 0
y = 1
i = 0
n = ABS(n)
If n < 2 Then
Fibonacci = n
Else
Do Until (i = n)
sum = x+y
x=y
y=sum
i=i+1
Loop
Fibonacci = x
End If
 
End Function
</syntaxhighlight>
 
==={{header|TI-83 BASIC}}===
==== Sequence table ====
<syntaxhighlight lang="ti83b">[Y=]
nMin=0
u(n)=u(n-1)+u(n-2)
u(nMin)={1,0}
[TABLE]
n u(n)
------- -------
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144 </syntaxhighlight>
 
==== Iterative ====
<syntaxhighlight lang="ti83b">{0,1
While 1
Disp Ans(1
{Ans(2),sum(Ans
End</syntaxhighlight>
 
==== Binet's formula ====
<syntaxhighlight lang="ti83b">Prompt N
.5(1+√(5 //golden ratio
(Ans^N–(-Ans)^-N)/√(5</syntaxhighlight>
 
==={{header|TI-89 BASIC}}===
====Recursive====
Optimized implementation (too slow to be usable for ''n'' higher than about 12).
<syntaxhighlight lang="ti89b">fib(n)
when(n<2, n, fib(n-1) + fib(n-2))</syntaxhighlight>
 
====Iterative====
Unoptimized implementation (I think the for loop can be eliminated, but I'm not sure).
<syntaxhighlight lang="ti89b">fib(n)
Func
Local a,b,c,i
0→a
1→b
For i,1,n
a→c
b→a
c+b→b
EndFor
a
EndFunc</syntaxhighlight>
 
==={{header|Tiny BASIC}}===
{{works with|TinyBasic}}
<syntaxhighlight lang="basic">10 LET A = 0
20 LET B = 1
30 PRINT "Which F_n do you want?"
40 INPUT N
50 IF N = 0 THEN GOTO 140
60 IF N = 1 THEN GOTO 120
70 LET C = B + A
80 LET A = B
90 LET B = C
100 LET N = N - 1
110 GOTO 60
120 PRINT B
130 END
140 PRINT 0
150 END
</syntaxhighlight>
 
==={{header|True BASIC}}===
<syntaxhighlight lang="qbasic">FUNCTION fibonacci (n)
LET n1 = 0
LET n2 = 1
FOR k = 1 TO ABS(n)
LET sum = n1 + n2
LET n1 = n2
LET n2 = sum
NEXT k
IF n < 0 THEN
LET fibonacci = n1 * ((-1) ^ ((-n) + 1))
ELSE
LET fibonacci = n1
END IF
END FUNCTION
 
PRINT fibonacci(0) ! 0
PRINT fibonacci(13) ! 233
PRINT fibonacci(-42) !-267914296
PRINT fibonacci(47) ! 2971215073
END</syntaxhighlight>
 
==={{header|VBA}}===
Like Visual Basic .NET, but with keyword "Public" and type Variant (subtype Currency) instead of Decimal:
<syntaxhighlight lang="vb">Public Function Fib(ByVal n As Integer) As Variant
Dim fib0 As Variant, fib1 As Variant, sum As Variant
Dim i As Integer
fib0 = 0
fib1 = 1
For i = 1 To n
sum = fib0 + fib1
fib0 = fib1
fib1 = sum
Next i
Fib = fib0
End Function </syntaxhighlight>
With Currency type, maximum value is fibo(73).
 
The (slow) recursive version:
 
<syntaxhighlight lang="vba">
Public Function RFib(Term As Integer) As Long
If Term < 2 Then RFib = Term Else RFib = RFib(Term - 1) + RFib(Term - 2)
End Function
</syntaxhighlight>
 
With Long type, maximum value is fibo(46).
 
==={{header|VBScript}}===
====Non-recursive, object oriented, generator====
Defines a generator class, with a default Get property. Uses Currency for larger-than-Long values. Tests for overflow and switches to Double. Overflow information also available from class.
 
=====Class Definition:=====
<syntaxhighlight lang="vb">class generator
dim t1
dim t2
dim tn
dim cur_overflow
Private Sub Class_Initialize
cur_overflow = false
t1 = ccur(0)
t2 = ccur(1)
tn = ccur(t1 + t2)
end sub
public default property get generated
on error resume next
 
generated = ccur(tn)
if err.number <> 0 then
generated = cdbl(tn)
cur_overflow = true
end if
t1 = ccur(t2)
if err.number <> 0 then
t1 = cdbl(t2)
cur_overflow = true
end if
t2 = ccur(tn)
if err.number <> 0 then
t2 = cdbl(tn)
cur_overflow = true
end if
tn = ccur(t1+ t2)
if err.number <> 0 then
tn = cdbl(t1) + cdbl(t2)
cur_overflow = true
end if
on error goto 0
end property
public property get overflow
overflow = cur_overflow
end property
end class</syntaxhighlight>
 
=====Invocation:=====
<syntaxhighlight lang="vb">dim fib
set fib = new generator
dim i
for i = 1 to 100
wscript.stdout.write " " & fib
if fib.overflow then
wscript.echo
exit for
end if
next</syntaxhighlight>
 
{{out}}
<pre> 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393</pre>
 
==={{header|Visual Basic}}===
{{works with|Visual Basic|VB6 Standard}}
Maximum integer value (7*10^28) can be obtained by using decimal type, but decimal type is only a sub type of the variant type.
<syntaxhighlight lang="vb">Sub fibonacci()
Const n = 139
Dim i As Integer
Dim f1 As Variant, f2 As Variant, f3 As Variant 'for Decimal
f1 = CDec(0): f2 = CDec(1) 'for Decimal setting
Debug.Print "fibo("; 0; ")="; f1
Debug.Print "fibo("; 1; ")="; f2
For i = 2 To n
f3 = f1 + f2
Debug.Print "fibo("; i; ")="; f3
f1 = f2
f2 = f3
Next i
End Sub 'fibonacci</syntaxhighlight>
{{Out}}
<pre>fibo( 0 )= 0
fibo( 1 )= 1
fibo( 2 )= 1
...
fibo( 137 )= 19134702400093278081449423917
fibo( 138 )= 30960598847965113057878492344
fibo( 139 )= 50095301248058391139327916261 </pre>
 
==={{header|Visual Basic .NET}}===
'''Platform:''' [[.NET]]
====Iterative====
{{works with|Visual Basic .NET|9.0+}}
With Decimal type, maximum value is fibo(139).
<syntaxhighlight lang="vbnet">Function Fib(ByVal n As Integer) As Decimal
Dim fib0, fib1, sum As Decimal
Dim i As Integer
fib0 = 0
fib1 = 1
For i = 1 To n
sum = fib0 + fib1
fib0 = fib1
fib1 = sum
Next
Fib = fib0
End Function</syntaxhighlight>
====Recursive====
{{works with|Visual Basic .NET|9.0+}}
<syntaxhighlight lang="vbnet">Function Seq(ByVal Term As Integer)
If Term < 2 Then Return Term
Return Seq(Term - 1) + Seq(Term - 2)
End Function</syntaxhighlight>
====BigInteger====
There is no real maximum value of BigInterger class, except the memory to store the number.
Within a minute, fibo(2000000) is a number with 417975 digits.
<syntaxhighlight lang="vbnet"> Function FiboBig(ByVal n As Integer) As BigInteger
' Fibonacci sequence with BigInteger
Dim fibn2, fibn1, fibn As BigInteger
Dim i As Integer
fibn = 0
fibn2 = 0
fibn1 = 1
If n = 0 Then
Return fibn2
ElseIf n = 1 Then
Return fibn1
ElseIf n >= 2 Then
For i = 2 To n
fibn = fibn2 + fibn1
fibn2 = fibn1
fibn1 = fibn
Next i
Return fibn
End If
Return 0
End Function 'FiboBig
 
Sub fibotest()
Dim i As Integer, s As String
i = 2000000 ' 2 millions
s = FiboBig(i).ToString
Console.WriteLine("fibo(" & i & ")=" & s & " - length=" & Len(s))
End Sub 'fibotest</syntaxhighlight>
 
====BigInteger, speedier method====
{{Libheader|System.Numerics}}
This method doesn't need to iterate the entire list, and is much faster. The 2000000 (two millionth) Fibonacci number can be found in a fraction of a second.<br/>Algorithm from [http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html here, see section 3, ''Finding Fibonacci Numbers Fully''.]
<syntaxhighlight lang="vbnet">Imports System
Imports System.Collections.Generic
Imports BI = System.Numerics.BigInteger
 
Module Module1
 
' A sparse array of values calculated along the way
Dim sl As SortedList(Of Integer, BI) = New SortedList(Of Integer, BI)()
 
' Square a BigInteger
Function sqr(ByVal n As BI) As BI
Return n * n
End Function
 
' Helper routine for Fsl(). It adds an entry to the sorted list when necessary
Sub IfNec(n As Integer)
If Not sl.ContainsKey(n) Then sl.Add(n, Fsl(n))
End Sub
 
' This routine is semi-recursive, but doesn't need to evaluate every number up to n.
' Algorithm from here: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#section3
Function Fsl(ByVal n As Integer) As BI
If n < 2 Then Return n
Dim n2 As Integer = n >> 1, pm As Integer = n2 + ((n And 1) << 1) - 1 : IfNec(n2) : IfNec(pm)
Return If(n2 > pm, (2 * sl(pm) + sl(n2)) * sl(n2), sqr(sl(n2)) + sqr(sl(pm)))
End Function
 
' Conventional iteration method (not used here)
Function Fm(ByVal n As BI) As BI
If n < 2 Then Return n
Dim cur As BI = 0, pre As BI = 1
For i As Integer = 0 To n - 1
Dim sum As BI = cur + pre : pre = cur : cur = sum : Next : Return cur
End Function
 
Sub Main()
Dim vlen As Integer, num As Integer = 2_000_000, digs As Integer = 35
Dim sw As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew()
Dim v As BI = Fsl(num) : sw.[Stop]()
Console.Write("{0:n3} ms to calculate the {1:n0}th Fibonacci number, ", sw.Elapsed.TotalMilliseconds, num)
vlen = CInt(Math.Ceiling(BI.Log10(v))) : Console.WriteLine("number of digits is {0}", vlen)
If vlen < 10000 Then
sw.Restart() : Console.WriteLine(v) : sw.[Stop]()
Console.WriteLine("{0:n3} ms to write it to the console.", sw.Elapsed.TotalMilliseconds)
Else
Console.Write("partial: {0}...{1}", v / BI.Pow(10, vlen - digs), v Mod BI.Pow(10, digs))
End If
End Sub
End Module</syntaxhighlight>
{{out}}
<pre>120.374 ms to calculate the 2,000,000th Fibonacci number, number of digits is 417975
partial: 85312949175076415430516606545038251...91799493108960825129188777803453125</pre>
 
==={{header|Xojo}}===
Pass n to this function where n is the desired number of iterations. This example uses the UInt64 datatype which is as unsigned 64 bit integer. As such, it overflows after the 93rd iteration.
<syntaxhighlight lang="vb">Function fibo(n As Integer) As UInt64
 
Dim noOne As UInt64 = 1
Dim noTwo As UInt64 = 1
Dim sum As UInt64
 
For i As Integer = 3 To n
sum = noOne + noTwo
noTwo = noOne
noOne = sum
Next
 
Return noOne
End Function</syntaxhighlight>
 
==={{header|Yabasic}}===
====Iterative====
<syntaxhighlight lang="vbnet">sub fibonacciI (n)
local n1, n2, k, sum
 
n1 = 0
n2 = 1
for k = 1 to abs(n)
sum = n1 + n2
n1 = n2
n2 = sum
next k
if n < 1 then
return n1 * ((-1) ^ ((-n) + 1))
else
return n1
end if
end sub</syntaxhighlight>
 
====Recursive====
Only positive numbers
<syntaxhighlight lang="vbnet">sub fibonacciR(n)
if n <= 1 then
return n
else
return fibonacciR(n-1) + fibonacciR(n-2)
end if
end sub</syntaxhighlight>
 
====Analytic====
Only positive numbers
<syntaxhighlight lang="vbnet">sub fibonacciA (n)
return int(0.5 + (((sqrt(5) + 1) / 2) ^ n) / sqrt(5))
end sub</syntaxhighlight>
 
====Binet's formula====
Fibonacci sequence using the Binet formula
<syntaxhighlight lang="vbnet">sub fibonacciB(n)
local sq5, phi1, phi2, dn1, dn2, k
 
sq5 = sqrt(5)
phi1 = (1 + sq5) / 2
phi2 = (1 - sq5) / 2
dn1 = phi1: dn2 = phi2
for k = 0 to n
dn1 = dn1 * phi1
dn2 = dn2 * phi2
print int(((dn1 - dn2) / sq5) + .5);
next k
end sub</syntaxhighlight>
 
==={{header|ZX Spectrum Basic}}===
====Iterative====
<syntaxhighlight lang="zxbasic">10 REM Only positive numbers
20 LET n=10
30 LET n1=0: LET n2=1
40 FOR k=1 TO n
50 LET sum=n1+n2
60 LET n1=n2
70 LET n2=sum
80 NEXT k
90 PRINT n1</syntaxhighlight>
 
====Analytic====
<syntaxhighlight lang="zxbasic">10 DEF FN f(x)=INT (0.5+(((SQR 5+1)/2)^x)/SQR 5)</syntaxhighlight>
 
=={{header|Batch File}}==
Recursive version
<syntaxhighlight lang="dos">::fibo.cmd
@echo off
if "%1" equ "" goto :eof
Line 1,866 ⟶ 3,249:
 
<!--- works with C syntax highlighting --->
<syntaxhighlight lang="c">
// Fibonacci sequence, recursive version
fun fibb
Line 1,911 ⟶ 3,294:
// vim: set syntax=c ts=4 sw=4 et:
</syntaxhighlight>
 
=={{header|BBC BASIC}}==
<syntaxhighlight lang=bbcbasic> PRINT FNfibonacci_r(1), FNfibonacci_i(1)
PRINT FNfibonacci_r(13), FNfibonacci_i(13)
PRINT FNfibonacci_r(26), FNfibonacci_i(26)
END
DEF FNfibonacci_r(N)
IF N < 2 THEN = N
= FNfibonacci_r(N-1) + FNfibonacci_r(N-2)
DEF FNfibonacci_i(N)
LOCAL F, I, P, T
IF N < 2 THEN = N
P = 1
FOR I = 1 TO N
T = F
F += P
P = T
NEXT
= F
</syntaxhighlight>
{{out}}
<pre> 1 1
233 233
121393 121393</pre>
 
=={{header|bc}}==
=== iterative ===
<syntaxhighlight lang="bc">#! /usr/bin/bc -q
 
define fib(x) {
Line 1,957 ⟶ 3,314:
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let fib(n) = n<=1 -> n, valof
Line 1,987 ⟶ 3,344:
=={{header|beeswax}}==
 
<syntaxhighlight lang="beeswax"> #>'#{;
_`Enter n: `TN`Fib(`{`)=`X~P~K#{;
#>~P~L#MM@>+@'q@{;
Line 1,996 ⟶ 3,353:
Notice the UInt64 wrap-around at <code>Fib(94)</code>!
 
<syntaxhighlight lang="julia">julia> beeswax("n-th Fibonacci number.bswx")
Enter n: i0
 
Line 2,027 ⟶ 3,384:
 
=={{header|Befunge}}==
<syntaxhighlight lang="befunge">00:.1:.>:"@"8**++\1+:67+`#@_v
^ .:\/*8"@"\%*8"@":\ <</syntaxhighlight>
 
=={{header|BlitzMax}}==
<syntaxhighlight lang="blitzmax">local a:int = 0, b:int = 1, c:int = 1, n:int
 
n = int(input( "Enter n: "))
Line 2,051 ⟶ 3,408:
 
=={{header|Blue}}==
<syntaxhighlight lang="blue">
: fib ( nth:ecx -- result:edi ) 1 0
: compute ( times:ecx accum:eax scratch:edi -- result:edi ) xadd latest loop ;
Line 2,063 ⟶ 3,420:
=== Recursive ===
A primitive recursive can be done with predicates:
<syntaxhighlight lang="bqn">Fib ← {𝕩>1 ? (𝕊 𝕩-1) + 𝕊 𝕩-2; 𝕩}</syntaxhighlight>
Or, it can be done with the Choose(<code>◶</code>) modifier:
<syntaxhighlight lang="bqn">Fib2 ← {(𝕩-1) (𝕩>1)◶⟨𝕩, +○𝕊⟩ 𝕩-2}</syntaxhighlight>
 
=== Iterative ===
An iterative solution can be made with the Repeat(<code>⍟</code>) modifier:
<syntaxhighlight lang="bqn">{⊑(+`⌽)⍟𝕩 0‿1}</syntaxhighlight>
 
=={{header|Bracmat}}==
===Recursive===
<syntaxhighlight lang="bracmat">fib=.!arg:<2|fib$(!arg+-2)+fib$(!arg+-1)</syntaxhighlight>
 
fib$30
Line 2,079 ⟶ 3,436:
 
===Iterative===
<syntaxhighlight lang="bracmat">(fib=
last i this new
. !arg:<2
Line 2,099 ⟶ 3,456:
{{works with|Brainf***|implementations with unbounded cell size}}
The first cell contains ''n'' (10), the second cell will contain ''fib(n)'' (55), and the third cell will contain ''fib(n-1)'' (34).
<syntaxhighlight lang="bf">++++++++++
>>+<<[->[->+>+<<]>[-<+>]>[-<+>]<<<]</syntaxhighlight>
 
The following generates n fibonacci numbers and prints them, though not in ascii.
It does have a limit due to the cells usually being 1 byte in size.
<syntaxhighlight lang="bf">+++++ +++++ #0 set to n
>> + Init #2 to 1
<<
Line 2,144 ⟶ 3,501:
=={{header|Brat}}==
===Recursive===
<syntaxhighlight lang="brat">fibonacci = { x |
true? x < 2, x, { fibonacci(x - 1) + fibonacci(x - 2) }
}</syntaxhighlight>
 
===Tail Recursive===
<syntaxhighlight lang="brat">fib_aux = { x, next, result |
true? x == 0,
result,
Line 2,160 ⟶ 3,517:
 
===Memoization===
<syntaxhighlight lang="brat">cache = hash.new
 
fibonacci = { x |
Line 2,167 ⟶ 3,524:
{true? x < 2, x, { cache[x] = fibonacci(x - 1) + fibonacci(x - 2) }}
}</syntaxhighlight>
 
=={{header|Bruijn}}==
 
<syntaxhighlight lang="bruijn">
:import std/Combinator .
:import std/Math .
:import std/List .
 
# unary/Church fibonacci (moderately fast but very high space complexity)
fib-unary [0 [[[2 0 [2 (1 0)]]]] k i]
 
:test (fib-unary (+6u)) ((+8u))
 
# ternary fibonacci using infinite list iteration (very fast)
fib-list \index fibs
fibs head <$> (iterate &[[0 : (1 + 0)]] ((+0) : (+1)))
 
:test (fib-list (+6)) ((+8))
 
# recursive fib (very slow)
fib-rec y [[0 <? (+1) (+0) (0 <? (+2) (+1) rec)]]
rec (1 --0) + (1 --(--0))
 
:test (fib-rec (+6)) ((+8))
</syntaxhighlight>
 
Performance using <code>HigherOrder</code> reduction without optimizations:
<syntaxhighlight>
> :time fib-list (+1000)
0.9 seconds
> :time fib-unary (+50u)
1.7 seconds
> :time fib-rec (+25)
5.1 seconds
> :time fib-list (+50)
0.0006 seconds
</syntaxhighlight>
 
=={{header|Burlesque}}==
 
<syntaxhighlight lang="burlesque">
{0 1}{^^++[+[-^^-]\/}30.*\[e!vv
</syntaxhighlight>
 
<syntaxhighlight lang="burlesque">
0 1{{.+}c!}{1000.<}w!
</syntaxhighlight>
Line 2,180 ⟶ 3,574:
=={{header|C}}==
===Recursive===
<syntaxhighlight lang="c">long long fibb(long long a, long long b, int n) {
return (--n>0)?(fibb(b, a+b, n)):(a);
}</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang="c">long long int fibb(int n) {
int fnow = 0, fnext = 1, tempf;
while(--n>0){
Line 2,196 ⟶ 3,590:
 
===Analytic===
<syntaxhighlight lang="c">#include <tgmath.h>
#define PHI ((1 + sqrt(5))/2)
 
Line 2,206 ⟶ 3,600:
{{trans|Python}}
{{works with|gcc|version 4.1.2 20080704 (Red Hat 4.1.2-44)}}
<syntaxhighlight lang="c">#include <stdio.h>
typedef enum{false=0, true=!0} bool;
typedef void iterator;
Line 2,249 ⟶ 3,643:
 
===Fast method for a single large value===
<syntaxhighlight lang="c">#include <stdlib.h>
#include <stdio.h>
#include <gmp.h>
Line 2,339 ⟶ 3,733:
 
=== Recursive ===
<syntaxhighlight lang="csharp">
public static ulong Fib(uint n) {
return (n < 2)? n : Fib(n - 1) + Fib(n - 2);
Line 2,346 ⟶ 3,740:
 
=== Tail-Recursive ===
<syntaxhighlight lang="csharp">
public static ulong Fib(uint n) {
return Fib(0, 1, n);
Line 2,357 ⟶ 3,751:
 
=== Iterative ===
<syntaxhighlight lang="csharp">
public static ulong Fib(uint x) {
if (x == 0) return 0;
Line 2,372 ⟶ 3,766:
}
</syntaxhighlight>
 
=== Iterative ===
<syntaxhighlight lang="csharp">
using System; using System.Text; // FIBRUS.cs Russia
namespace Fibrus { class Program { static void Main()
{ long fi1=1; long fi2=1; long fi3=1; int da; int i; int d;
for (da=1; da<=78; da++) // rextester.com/MNGUV70257
{ d = 20-Convert.ToInt32((Convert.ToString(fi3)).Length);
for (i=1; i<d; i++) Console.Write(".");
Console.Write(fi3); Console.Write(" "); Console.WriteLine(da);
fi3 = fi2 + fi1;
fi1 = fi2;
fi2 = fi3;
}}}}
</syntaxhighlight>
{{out}}
<pre>
..................1 1
..................2 2
..................3 3
...
...5527939700884757 76
...8944394323791464 77
..14472334024676221 78
</pre>
 
=== Eager-Generative ===
<syntaxhighlight lang="csharp">
public static IEnumerable<long> Fibs(uint x) {
IList<ulong> fibs = new List<ulong>();
Line 2,392 ⟶ 3,811:
 
=== Lazy-Generative ===
<syntaxhighlight lang="csharp">
public static IEnumerable<ulong> Fibs(uint x) {
ulong prev = -1;
Line 2,407 ⟶ 3,826:
=== Analytic ===
This returns digits up to the 93<sup>rd</sup> Fibonacci number, but the digits become inaccurate past the 71<sup>st</sup>. There is custom rounding applied to the result that allows the function to be accurate at the 71<sup>st</sup> number instead of topping out at the 70<sup>th</sup>.
<syntaxhighlight lang="csharp">static double r5 = Math.Sqrt(5.0), Phi = (r5 + 1.0) / 2.0;
 
static ulong fib(uint n) {
if (n > 71) throw new ArgumentOutOfRangeException("n", n, "Needs to be smaller than 72.");
double r = Math.Pow(Phi, n) / r5;
return (ulong)(n < 64 ? Math.Round(r) : Math.Floor(r)); }</syntaxhighlight>To get to the 93<sup>rd</sup> Fibonacci number, one must use the decimal type, rather than the double type, like this:<syntaxhighlight lang="csharp">static decimal Sqrt_dec(decimal x, decimal g) { decimal t, lg;
do { t = x / g; lg = g; g = (t + g) / 2M; } while (lg != g);
return g; }
Line 2,427 ⟶ 3,846:
if (n > 93) throw new ArgumentOutOfRangeException("n", n, "Needs to be smaller than 94.");
decimal r = Pow_dec(Phi, n) / r5;
return (ulong)(n < 64 ? Math.Round(r) : Math.Floor(r)); }</syntaxhighlight>Note that the Math.Pow() function and the Math.Sqrt() function must be replaced with ones returning the decimal type.<br/><br/>If one allows the fib() function to return the decimal type, one can reach the 138<sup>th</sup> Fibonacci number. However, the accuracy is lost after the 128<sup>th.</sup><syntaxhighlight lang="csharp">static decimal Sqrt_dec(decimal x, decimal g) { decimal t, lg;
do { t = x / g; lg = g; g = (t + g) / 2M; } while (lg != g);
return g; }
Line 2,450 ⟶ 3,869:
Needs <code>System.Windows.Media.Matrix</code> or similar Matrix class.
Calculates in <math>O(n)</math>.
<syntaxhighlight lang="csharp">
public static ulong Fib(uint n) {
var M = new Matrix(1,0,0,1);
Line 2,460 ⟶ 3,879:
Needs <code>System.Windows.Media.Matrix</code> or similar Matrix class.
Calculates in <math>O(\log{n})</math>.
<syntaxhighlight lang="csharp">
private static Matrix M;
private static readonly Matrix N = new Matrix(1,1,1,0);
Line 2,480 ⟶ 3,899:
 
=== Array (Table) Lookup ===
<syntaxhighlight lang="csharp">
private static int[] fibs = new int[]{ -1836311903, 1134903170,
-701408733, 433494437, -267914296, 165580141, -102334155,
Line 2,503 ⟶ 3,922:
This large step recurrence routine can calculate the two millionth Fibonacci number in under 1 / 5 second at tio.run. This routine can generate the fifty millionth Fibonacci number in under 30 seconds at tio.run. The unused conventional iterative method times out at two million on tio.run, you can only go to around 1,290,000 or so to keep the calculation time (plus string conversion time) under the 60 second timeout limit there. When using this large step recurrence method, it takes around 5 seconds to convert the two millionth Fibonacci number (417975 digits) into a string (so that one may count those digits).
 
<syntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using BI = System.Numerics.BigInteger;
Line 2,551 ⟶ 3,970:
partial: 85312949175076415430516606545038251...91799493108960825129188777803453125
</pre>
 
===Shift PowerMod===
{{libheader|System.Numerics}}
Illustrated here is an algorithm to compute a Fibonacci number directly, without needing to calculate any of the Fibonacci numbers less than the desired result. It uses shifting and the power mod function (<code>BigInteger.ModPow()</code> in C#). It calculates more quickly than the large step recurrence routine (illustrated above) for smaller Fibonacci numbers (less than 2800 digits or so, around Fibonacci(13000)), but gets slower for larger ones, as the intermediate BigIntegers created are very large, much larger than the Fibonacci result.
 
Also included is a routine that returns an array of Fibonacci numbers (<code>fibTab()</code>). It reuses the intermediate large shifted BigIntegers on suceeding iterations, therfore it is a little more efficient than calling the oneshot (<code>oneFib()</code>) routine repeatedly from a loop.
 
<syntaxhighlight lang="csharp">using System;
using BI = System.Numerics.BigInteger;
 
class Program {
// returns the nth Fibonacci number without calculating 0..n-1
static BI oneFib(int n) {
BI z = (BI)1 << ++n;
return BI.ModPow(z, n, (z << n) - z - 1) % z;
}
 
// returns an array of Fibonacci numbers from the 0th to the nth
static BI[] fibTab(int n) {
var res = new BI[++n];
BI z = (BI)1 << 1, zz = z << 1;
for (int i = 0; i < n; ) {
res[i] = BI.ModPow(z, ++i, zz - z - 1) % z;
z <<= 1; zz <<= 2;
}
return res;
}
static void Main(string[] args) {
int n = 20;
Console.WriteLine("Fibonacci numbers 0..{0}: {1}", n, string.Join(" ",fibTab(n)));
n = 1000;
Console.WriteLine("Fibonacci({0}): {1}", n, oneFib(n));
}
}</syntaxhighlight>
{{out}}
<pre>Fibonacci numbers 0..20: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
Fibonacci(1000): 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875</pre>
 
=={{header|C++}}==
Using unsigned int, this version only works up to 48 before fib overflows.
<syntaxhighlight lang="cpp">#include <iostream>
 
int main()
Line 2,575 ⟶ 4,033:
This version does not have an upper bound.
 
<syntaxhighlight lang="cpp">#include <iostream>
#include <gmpxx.h>
 
Line 2,598 ⟶ 4,056:
 
Version using transform:
<syntaxhighlight lang="cpp">#include <algorithm>
#include <vector>
#include <functional>
Line 2,613 ⟶ 4,071:
 
Far-fetched version using adjacent_difference:
<syntaxhighlight lang="cpp">#include <numeric>
#include <vector>
#include <functional>
Line 2,628 ⟶ 4,086:
 
Version which computes at compile time with metaprogramming:
<syntaxhighlight lang="cpp">#include <iostream>
 
template <int n> struct fibo
Line 2,654 ⟶ 4,112:
 
The following version is based on fast exponentiation:
<syntaxhighlight lang="cpp">#include <iostream>
 
inline void fibmul(int* f, int* g)
Line 2,693 ⟶ 4,151:
===Using Zeckendorf Numbers===
The nth fibonacci is represented as Zeckendorf 1 followed by n-1 zeroes. [[Zeckendorf number representation#Using a C++11 User Defined Literal|Here]] I define a class N which defines the operations increment ++() and comparison <=(other N) for Zeckendorf Numbers.
<syntaxhighlight lang="cpp">
// Use Zeckendorf numbers to display Fibonacci sequence.
// Nigel Galloway October 23rd., 2012
Line 2,717 ⟶ 4,175:
===Using Standard Template Library===
Possibly less "Far-fetched version".
<syntaxhighlight lang="cpp">
// Use Standard Template Library to display Fibonacci sequence.
// Nigel Galloway March 30th., 2013
Line 2,734 ⟶ 4,192:
 
=={{header|Cat}}==
<syntaxhighlight lang="cat">define fib {
dup 1 <=
[]
Line 2,742 ⟶ 4,200:
 
=={{header|Chapel}}==
<syntaxhighlight lang="chapel">iter fib() {
var a = 0, b = 1;
 
Line 2,752 ⟶ 4,210:
 
=={{header|Chef}}==
<syntaxhighlight lang="chef">Stir-Fried Fibonacci Sequence.
 
An unobfuscated iterative implementation.
Line 2,783 ⟶ 4,241:
 
Serves 1.</syntaxhighlight>
 
=={{header|Chez Scheme}}==
<syntaxhighlight lang="scheme">
(define fib (lambda (n) (cond ((> n 1) (+ (fib (- n 1)) (fib (- n 2))))
((= n 1) 1)
((= n 0) 0))))
</syntaxhighlight>
 
=={{header|Clio}}==
Line 2,788 ⟶ 4,253:
Clio is pure and functions are lazy and memoized by default
 
<syntaxhighlight lang="clio">fn fib n:
if n < 2: n
else: (n - 1 -> fib) + (n - 2 -> fib)
Line 2,798 ⟶ 4,263:
===Lazy Sequence===
This is implemented idiomatically as an infinitely long, lazy sequence of all Fibonacci numbers:
<syntaxhighlight lang=Clojure"clojure">(defn fibs []
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))</syntaxhighlight>
Thus to get the nth one:
<syntaxhighlight lang=Clojure"clojure">(nth (fibs) 5)</syntaxhighlight>
So long as one does not hold onto the head of the sequence, this is unconstrained by length.
 
The one-line implementation may look confusing at first, but on pulling it apart it actually solves the problem more "directly" than a more explicit looping construct.
<syntaxhighlight lang=Clojure"clojure">(defn fibs []
(map first ;; throw away the "metadata" (see below) to view just the fib numbers
(iterate ;; create an infinite sequence of [prev, curr] pairs
Line 2,813 ⟶ 4,278:
 
A more elegant solution is inspired by the Haskell implementation of an infinite list of Fibonacci numbers:
<syntaxhighlight lang=Clojure"clojure">(def fib (lazy-cat [0 1] (map + fib (rest fib))))</syntaxhighlight>
Then, to see the first ten,
<syntaxhighlight lang=Clojure"clojure">user> (take 10 fib)
(0 1 1 2 3 5 8 13 21 34)</syntaxhighlight>
 
Line 2,821 ⟶ 4,286:
 
Here's a simple interative process (using a recursive function) that carries state along with it (as args) until it reaches a solution:
<syntaxhighlight lang=Clojure"clojure">;; max is which fib number you'd like computed (0th, 1st, 2nd, etc.)
;; n is which fib number you're on for this call (0th, 1st, 2nd, etc.)
;; j is the nth fib number (ex. when n = 5, j = 5)
Line 2,844 ⟶ 4,309:
Based upon the doubling algorithm which computes in O(log (n)) time as described here https://www.nayuki.io/page/fast-fibonacci-algorithms
Implementation credit: https://stackoverflow.com/questions/27466311/how-to-implement-this-fast-doubling-fibonacci-algorithm-in-clojure/27466408#27466408
<syntaxhighlight lang="clojure">
(defn fib [n]
(letfn [(fib* [n]
Line 2,862 ⟶ 4,327:
A naive slow recursive solution:
 
<syntaxhighlight lang=Clojure"clojure">(defn fib [n]
(case n
0 0
Line 2,871 ⟶ 4,336:
This can be improved to an O(n) solution, like the iterative solution, by memoizing the function so that numbers that have been computed are cached. Like a lazy sequence, this also has the advantage that subsequent calls to the function use previously cached results rather than recalculating.
 
<syntaxhighlight lang=Clojure"clojure">(def fib
(memoize
(fn [n]
Line 2,881 ⟶ 4,346:
 
=== Using core.async ===
<syntaxhighlight lang=Clojure"clojure">(ns fib.core)
(require '[clojure.core.async
:refer [<! >! >!! <!! timeout chan alt! go]])
Line 2,900 ⟶ 4,365:
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% Generate Fibonacci numbers
fib = iter () yields (int)
a: int := 0
Line 2,964 ⟶ 4,429:
Iteration uses a while() loop. Memoization uses global properties.
 
<syntaxhighlight lang="cmake">set_property(GLOBAL PROPERTY fibonacci_0 0)
set_property(GLOBAL PROPERTY fibonacci_1 1)
set_property(GLOBAL PROPERTY fibonacci_next 2)
Line 2,993 ⟶ 4,458:
endfunction(fibonacci)</syntaxhighlight>
 
<syntaxhighlight lang="cmake"># Test program: print 0th to 9th and 25th to 30th Fibonacci numbers.
set(s "")
foreach(i RANGE 0 9)
Line 3,010 ⟶ 4,475:
=={{header|COBOL}}==
===Iterative===
<syntaxhighlight lang="cobol">Program-ID. Fibonacci-Sequence.
Data Division.
Working-Storage Section.
Line 3,053 ⟶ 4,518:
===Recursive===
{{works with|GNU Cobol|2.0}}
<syntaxhighlight lang="cobol"> >>SOURCE FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. fibonacci-main.
Line 3,101 ⟶ 4,566:
=={{header|CoffeeScript}}==
===Analytic===
<syntaxhighlight lang="coffeescript">fib_ana = (n) ->
sqrt = Math.sqrt
phi = ((1 + sqrt(5))/2)
Line 3,107 ⟶ 4,572:
 
===Iterative===
<syntaxhighlight lang="coffeescript">fib_iter = (n) ->
return n if n < 2
[prev, curr] = [0, 1]
Line 3,114 ⟶ 4,579:
 
===Recursive===
<syntaxhighlight lang="coffeescript">fib_rec = (n) ->
if n < 2 then n else fib_rec(n-1) + fib_rec(n-2)</syntaxhighlight>
 
Line 3,122 ⟶ 4,587:
 
===Iterative===
<syntaxhighlight lang="cf0x10">stop = 6
a = 1
i = 1 # start
Line 3,141 ⟶ 4,606:
Note that Common Lisp uses bignums, so this will never overflow.
===Iterative===
<syntaxhighlight lang="lisp">(defun fibonacci-iterative (n &aux (f0 0) (f1 1))
(case n
(0 f0)
Line 3,151 ⟶ 4,616:
 
Simpler one:
<syntaxhighlight lang="lisp">(defun fibonacci (n)
(let ((a 0) (b 1) (c n))
(loop for i from 2 to n do
Line 3,159 ⟶ 4,624:
c))</syntaxhighlight>
 
Not a function, just printing out the entire (for some definition of "entire") sequence with a <code>for var = </code> loop:<syntaxhighlight lang="lisp">(loop for x = 0 then y and y = 1 then (+ x y) do (print x))</syntaxhighlight>
 
===Recursive===
<syntaxhighlight lang="lisp">(defun fibonacci-recursive (n)
(if (< n 2)
n
Line 3,168 ⟶ 4,633:
 
 
<syntaxhighlight lang="lisp">(defun fibonacci-tail-recursive ( n &optional (a 0) (b 1))
(if (= n 0)
a
Line 3,174 ⟶ 4,639:
 
Tail recursive and squaring:
<syntaxhighlight lang="lisp">(defun fib (n &optional (a 1) (b 0) (p 0) (q 1))
(if (= n 1) (+ (* b p) (* a q))
(fib (ash n -1)
Line 3,186 ⟶ 4,651:
I use [https://franz.com/downloads/clp/survey Allegro CL 10.1]
 
<syntaxhighlight lang="lisp">
;; Project : Fibonacci sequence
 
Line 3,217 ⟶ 4,682:
 
=== Solution with methods and eql specializers ===
<syntaxhighlight lang="lisp">
(defmethod fib (n)
(declare ((integer 0 *) n))
Line 3,231 ⟶ 4,696:
This solution uses a list to keep track of the Fibonacci sequence for 0 or a
positive integer.
<syntaxhighlight lang="lisp">(defun fibo (n)
(cond ((< n 0) nil)
((< n 2) n)
Line 3,271 ⟶ 4,736:
we reverse it back when we return it).
 
<syntaxhighlight lang="lisp">(defparameter *fibo-start* '(1 1)) ; elements 1 and 2
 
;;; Helper functions
Line 3,318 ⟶ 4,783:
=={{header|Computer/zero Assembly}}==
To find the <math>n</math>th Fibonacci number, set the initial value of <tt>count</tt> equal to <math>n</math>–2 and run the program. The machine will halt with the answer stored in the accumulator. Since Computer/zero's word length is only eight bits, the program will not work with values of <math>n</math> greater than 13.
<syntaxhighlight lang="czasm">loop: LDA y ; higher No.
STA temp
ADD x ; lower No.
Line 3,340 ⟶ 4,805:
y: 1
temp: 0</syntaxhighlight>
 
=={{header|Coq}}==
<syntaxhighlight lang="coq">
Fixpoint rec_fib (m : nat) (a : nat) (b : nat) : nat :=
match m with
| 0 => a
| S k => rec_fib k b (a + b)
end.
 
Definition fib (n : nat) : nat :=
rec_fib n 0 1 .
</syntaxhighlight>
 
=={{header|Corescript}}==
<syntaxhighlight lang="corescript">print Fibonacci Sequence:
var previous = 1
var number = 0
Line 3,359 ⟶ 4,836:
 
=={{header|Cowgol}}==
<syntaxhighlight lang="cowgol">include "cowgol.coh";
 
sub fibonacci(n: uint32): (a: uint32) is
Line 3,386 ⟶ 4,863:
 
=={{header|Crystal}}==
 
===Recursive===
<syntaxhighlight lang="ruby">def fib(n)
n < 2 ? n : fib(n - 1) + fib(n - 2)
end</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang="ruby">def fibIterative(n, prevFib = 0, fib = 1)
return n if n < 2
 
Line 3,404 ⟶ 4,880:
 
===Tail Recursive===
<syntaxhighlight lang="ruby">def fibTailRecursive(n, prevFib = 0, fib = 1)
n == 0 ? prevFib : fibTailRecursive(n - 1, fib, prevFib + fib)
end</syntaxhighlight>
 
===Analytic===
<syntaxhighlight lang="ruby">def fibBinet(n)
(((5 ** 0.5 + 1) / 2) ** n / 5 ** 0.5).round.to_i
end</syntaxhighlight>
Line 3,416 ⟶ 4,892:
Here are four versions of Fibonacci Number calculating functions. ''FibD'' has an argument limit of magnitude 84 due to floating point precision, the others have a limit of 92 due to overflow (long).The traditional recursive version is inefficient. It is optimized by supplying a static storage to store intermediate results. A Fibonacci Number generating function is added.
All functions have support for negative arguments.
<syntaxhighlight lang="d">import std.stdio, std.conv, std.algorithm, std.math;
 
long sgn(alias unsignedFib)(int n) { // break sign manipulation apart
Line 3,512 ⟶ 4,988:
0:0 | -1:1 | -2:-1 | -3:2 | -4:-3 | -5:5 | -6:-8 | -7:13 | -8:-21 | -9:34 | </pre>
===Matrix Exponentiation Version===
<syntaxhighlight lang="d">import std.bigint;
 
T fibonacciMatrix(T=BigInt)(size_t n) {
Line 3,545 ⟶ 5,021:
===Faster Version===
For N = 10_000_000 this is about twice faster (run-time about 2.20 seconds) than the matrix exponentiation version.
<syntaxhighlight lang="d">import std.bigint, std.math;
 
// Algorithm from: Takahashi, Daisuke,
Line 3,591 ⟶ 5,067:
 
=={{header|Dart}}==
<syntaxhighlight lang="dart">int fib(int n) {
if (n==0 || n==1) {
return n;
Line 3,613 ⟶ 5,089:
=={{header|Datalog}}==
Simple recurive implementation for Souffle.
<syntaxhighlight lang="datalog">.decl Fib(i:number, x:number)
Fib(0, 0).
Fib(1, 1).
Line 3,620 ⟶ 5,096:
 
=={{header|DBL}}==
<syntaxhighlight lang="dart">;
; Fibonacci sequence for DBL version 4 by Dario B.
;
Line 3,659 ⟶ 5,135:
This needs a modern Dc with <code>r</code> (swap) and <code>#</code> (comment).
It easily can be adapted to an older Dc, but it will impact readability a lot.
<syntaxhighlight lang="dc">[ # todo: n(<2) -- 1 and break 2 levels
d - # 0
1 + # 1
Line 3,684 ⟶ 5,160:
 
=== Iterative ===
<syntaxhighlight lang=Delphi"delphi">
function FibonacciI(N: Word): UInt64;
var
Line 3,706 ⟶ 5,182:
 
=== Recursive ===
<syntaxhighlight lang=Delphi"delphi">
function Fibonacci(N: Word): UInt64;
begin
Line 3,719 ⟶ 5,195:
Algorithm is based on
:<math>\begin{pmatrix}1&1\\1&0\end{pmatrix}^n = \begin{pmatrix}F(n+1)&F(n)\\F(n)&F(n-1)\end{pmatrix}</math>.
<syntaxhighlight lang=Delphi"delphi">
function fib(n: Int64): Int64;
 
Line 3,759 ⟶ 5,235:
 
=={{header|DIBOL-11}}==
<syntaxhighlight lang=DIBOL"dibol-11">
 
; START Redone ;Firstto include the first 10two Fibonaccivalues NUmbersthat
; are noot computed.
 
START ;First 15 Fibonacci NUmbers
 
 
Line 3,768 ⟶ 5,247:
FIB2, D10, 1
FIBNEW, D10
LOOPCNT, D2, 13
 
RECORD HEADER
, A32, "First 1015 Fibonacci Numbers."
 
RECORD OUTPUT
Line 3,784 ⟶ 5,263:
WRITES(8,HEADER)
 
; The First Two are given.
 
FIBOUT = 0
LOOPOUT = 1
WRITES(8,OUTPUT)
FIBOUT = 1
LOOPOUT = 2
WRITES(8,OUTPUT)
 
; The Rest are Computed.
LOOP,
FIBNEW = FIB1 + FIB2
Line 3,795 ⟶ 5,285:
LOOPCNT = LOOPCNT + 1
IF LOOPCNT .LE. 1015 GOTO LOOP
 
CLOSE 8
END
 
 
 
</syntaxhighlight>
 
=={{header|DWScript}}==
 
<syntaxhighlight lang=Delphi"delphi">function fib(N : Integer) : Integer;
begin
if N < 2 then Result := 1
Line 3,813 ⟶ 5,305:
=={{header|Dyalect}}==
 
<syntaxhighlight lang=Dyalect"dyalect">func fib(n) {
if n < 2 {
return n
Line 3,824 ⟶ 5,316:
 
=={{header|E}}==
<syntaxhighlight lang="e">def fib(n) {
var s := [0, 1]
for _ in 0..!n {
Line 3,837 ⟶ 5,329:
=={{header|EasyLang}}==
 
<syntaxhighlight lang="text">
<lang>func fib n . res .
func iffib n < 2.
if resn =< n2
return n
.
prev = 0.
val prev = 10
for _val range n -= 1
for resi = prev2 +to valn
prev h = prev + val
val prev = resval
val = h
.
.
return val
.
callprint fib 36 r
print r</syntaxhighlight>
 
Recursive (inefficient):
 
<syntaxhighlight lang="text">
<lang>func fib n . res .
func iffib n < 2.
if resn =< n2
return n
else
.
call fib n - 1 a
callreturn fib (n - 2) b+ fib (n - 1)
res = a + b
.
.
callprint fib 36 r
print r</syntaxhighlight>
 
=={{header|EchoLisp}}==
Use '''memoization''' with the recursive version.
<syntaxhighlight lang="scheme">
(define (fib n)
(if (< n 2) n
Line 3,883 ⟶ 5,375:
===Analytic===
 
<syntaxhighlight lang=ECL"ecl">//Calculates Fibonacci sequence up to n steps using Binet's closed form solution
 
 
Line 3,915 ⟶ 5,407:
=={{header|EDSAC order code}}==
This program calculates the <i>n</i>th—by default the tenth—number in the Fibonacci sequence and displays it (in binary) in the first word of storage tank 3.
<syntaxhighlight lang="edsac">[ Fibonacci sequence
==================
Line 3,971 ⟶ 5,463:
 
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
class
APPLICATION
Line 4,026 ⟶ 5,518:
=={{header|Ela}}==
Tail-recursive function:
<syntaxhighlight lang=Ela"ela">fib = fib' 0 1
where fib' a b 0 = a
fib' a b n = fib' b (a + b) (n - 1)</syntaxhighlight>
Infinite (lazy) list:
<syntaxhighlight lang=Ela"ela">fib = fib' 1 1
where fib' x y = & x :: fib' y (x + y)</syntaxhighlight>
 
=={{header|Elena}}==
{{trans|Smalltalk}}
ELENA 56.0x :
<syntaxhighlight lang="elena">import extensions;
fibu(n)
Line 4,047 ⟶ 5,539:
else
{
for(int i := 2,; i <= n,; i+=1)
{
int t := ac[1];
Line 4,060 ⟶ 5,552:
public program()
{
for(int i := 0,; i <= 10,; i+=1)
{
console.printLine(fibu(i))
Line 4,081 ⟶ 5,573:
=== Alternative version using yieldable method ===
 
<syntaxhighlight lang="elena">import extensions;
 
public FibonacciGenerator
Line 4,090 ⟶ 5,582:
long n_1 := 1l;
 
$yield: n_2;
$yield: n_1;
 
while(true)
Line 4,097 ⟶ 5,589:
long n := n_2 + n_1;
 
$yield: n;
 
n_2 := n_1;
Line 4,109 ⟶ 5,601:
auto e := new FibonacciGenerator();
for(int i := 0,; i < 10,; i += 1) {
console.printLine(e.next())
};
Line 4,117 ⟶ 5,609:
 
=={{header|Elixir}}==
<syntaxhighlight lang=Elixir"elixir">defmodule Fibonacci do
def fib(0), do: 0
def fib(1), do: 1
Line 4,132 ⟶ 5,624:
 
Using Stream:
<syntaxhighlight lang=Elixir"elixir">
Stream.unfold({0,1}, fn {a,b} -> {a,{b,a+b}} end) |> Enum.take(10)
</syntaxhighlight>
Line 4,142 ⟶ 5,634:
 
=={{header|Elm}}==
 
Naïve recursive implementation.
<syntaxhighlight lang="haskell">fibonacci : Int -> Int
fibonacci n = if n < 2 then
n
else
fibonacci(n - 2) + fibonacci(n - 1)</syntaxhighlight>
 
 
'''version 2'''
<syntaxhighlight lang=”elm">fib : Int -> number
fib n =
case n of
0 -> 0
1 -> 1
_ -> fib (n-1) + fib (n-2)
 
</syntaxhighlight>
{{out}}
<pre>
elm repl
> fib 40
102334155 : number
 
> List.map (\elem -> fib elem) (List.range 1 40)
[1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,
4181,6765,10946,17711,28657,46368,75025,121393,196418,
317811,514229,832040,1346269,2178309,3524578,5702887,
9227465,14930352,24157817,39088169,63245986,102334155]
: List number
</pre>
 
=={{header|Emacs Lisp}}==
Line 4,153 ⟶ 5,670:
===version 1===
 
<syntaxhighlight lang=Lisp"lisp">(defun fib (n a b c)
(cond
((< c n) (fib n b (+ a b) (+ 1 c)))
Line 4,166 ⟶ 5,683:
===version 2===
 
<syntaxhighlight lang=Lisp"lisp">(defun fibonacci (n)
(let (vec i j k)
(if (< n 2)
Line 4,184 ⟶ 5,701:
<b>Eval:</b>
 
<syntaxhighlight lang=Lisp"lisp">(insert
(mapconcat (lambda (n) (format "%d" (fibonacci n)))
(number-sequence 0 15) " "))</syntaxhighlight>
Line 4,194 ⟶ 5,711:
=={{header|Erlang}}==
===Recursive ===
<syntaxhighlight lang=Erlang"erlang">
-module(fib).
-export([fib/1]).
Line 4,204 ⟶ 5,721:
 
===Iterative ===
<syntaxhighlight lang=Erlang"erlang">
-module(fiblin).
-export([fib/1])
Line 4,221 ⟶ 5,738:
 
<b> Evaluate:</b>
<syntaxhighlight lang=Erlang"erlang">
io:write([fiblin:fib(X) || X <- lists:seq(1,10) ]).
</syntaxhighlight>
Line 4,231 ⟶ 5,748:
 
===Iterative 2===
<syntaxhighlight lang=Erlang"erlang">
fib(N) -> fib(N, 0, 1).
 
Line 4,240 ⟶ 5,757:
 
=={{header|ERRE}}==
<syntaxhighlight lang=ERRE"erre">!-------------------------------------------
! derived from my book "PROGRAMMARE IN ERRE"
! iterative solution
Line 4,277 ⟶ 5,794:
==='Recursive' version===
{{works with|Euphoria|any version}}
<syntaxhighlight lang=Euphoria"euphoria">
function fibor(integer n)
if n<2 then return n end if
Line 4,286 ⟶ 5,803:
==='Iterative' version===
{{works with|Euphoria|any version}}
<syntaxhighlight lang=Euphoria"euphoria">
function fiboi(integer n)
integer f0=0, f1=1, f
Line 4,301 ⟶ 5,818:
==='Tail recursive' version===
{{works with|Euphoria|4.0.0}}
<syntaxhighlight lang=Euphoria"euphoria">
function fibot(integer n, integer u = 1, integer s = 0)
if n < 1 then
Line 4,316 ⟶ 5,833:
==='Paper tape' version===
{{works with|Euphoria|4.0.0}}
<syntaxhighlight lang=Euphoria"euphoria">
include std/mathcons.e -- for PINF constant
 
Line 4,405 ⟶ 5,922:
 
{{Works with|Office 365 Betas 2021}}
<syntaxhighlight lang="lisp">FIBONACCI
=LAMBDA(n,
APPLYN(n - 2)(
Line 4,419 ⟶ 5,936:
 
And assuming that the following names are also bound to reusable generic lambdas in the Name manager:
<syntaxhighlight lang="lisp">APPENDROWS
=LAMBDA(xs,
LAMBDA(ys,
Line 4,543 ⟶ 6,060:
Or as a fold, obtaining just the Nth term of the Fibonacci series:
 
<syntaxhighlight lang="lisp">FIBONACCI2
=LAMBDA(n,
INDEX(
Line 4,561 ⟶ 6,078:
Assuming the following generic bindings in the Excel worksheet Name manager:
 
<syntaxhighlight lang="lisp">APPEND
=LAMBDA(xs,
LAMBDA(ys,
Line 4,647 ⟶ 6,164:
=={{header|F_Sharp|F#}}==
This is a fast [tail-recursive] approach using the F# big integer support:
<syntaxhighlight lang="fsharp">
let fibonacci n : bigint =
let rec f a b n =
Line 4,658 ⟶ 6,175:
val it : bigint = 354224848179261915075I</syntaxhighlight>
Lazy evaluated using sequence workflow:
<syntaxhighlight lang="fsharp">let rec fib = seq { yield! [0;1];
for (a,b) in Seq.zip fib (Seq.skip 1 fib) -> a+b}</syntaxhighlight>
 
Line 4,664 ⟶ 6,181:
 
Lazy evaluation using the sequence unfold anamorphism is much much better as to efficiency:
<syntaxhighlight lang="fsharp">let fibonacci = Seq.unfold (fun (x, y) -> Some(x, (y, x + y))) (0I,1I)
fibonacci |> Seq.nth 10000
</syntaxhighlight>
Line 4,671 ⟶ 6,188:
Since it uses exponentiation by squaring, calculations of fib(n) where n is a power of 2 are particularly quick.
Eg. fib(2^20) was calculated in a little over 4 seconds on this poster's laptop.
<syntaxhighlight lang="fsharp">
open System
open System.Diagnostics
Line 4,719 ⟶ 6,236:
=={{header|Factor}}==
===Iterative===
<syntaxhighlight lang="factor">: fib ( n -- m )
dup 2 < [
[ 0 1 ] dip [ swap [ + ] keep ] times
Line 4,726 ⟶ 6,243:
 
===Recursive===
<syntaxhighlight lang="factor">: fib ( n -- m )
dup 2 < [
[ 1 - fib ] [ 2 - fib ] bi +
Line 4,732 ⟶ 6,249:
 
===Tail-Recursive===
<syntaxhighlight lang="factor">: fib2 ( x y n -- a )
dup 1 <
[ 2drop ]
Line 4,741 ⟶ 6,258:
===Matrix===
{{trans|Ruby}}
<syntaxhighlight lang="factor">USE: math.matrices
 
: fib ( n -- m )
Line 4,751 ⟶ 6,268:
=={{header|Falcon}}==
===Iterative===
<syntaxhighlight lang="falcon">function fib_i(n)
 
if n < 2: return n
Line 4,765 ⟶ 6,282:
end</syntaxhighlight>
===Recursive===
<syntaxhighlight lang="falcon">function fib_r(n)
if n < 2 : return n
return fib_r(n-1) + fib_r(n-2)
end</syntaxhighlight>
===Tail Recursive===
<syntaxhighlight lang="falcon">function fib_tr(n)
return fib_aux(n,0,1)
end
Line 4,781 ⟶ 6,298:
 
=={{header|FALSE}}==
<syntaxhighlight lang="false">[[$0=~][1-@@\$@@+\$44,.@]#]f:
20n: {First 20 numbers}
0 1 n;f;!%%44,. {Output: "0,1,1,2,3,5..."}</syntaxhighlight>
 
=={{header|Fancy}}==
<syntaxhighlight lang="fancy">class Fixnum {
def fib {
match self -> {
Line 4,805 ⟶ 6,322:
Ints have a limit of 64-bits, so overflow errors occur after computing Fib(92) = 7540113804746346429.
 
<syntaxhighlight lang="fantom">
class Main
{
Line 4,827 ⟶ 6,344:
}
}
</syntaxhighlight>
 
=={{header|Fe}}==
Recursive:
<syntaxhighlight lang="clojure">
(= fib (fn (n)
(if (< n 2) n
(+ (fib (- n 1)) (fib (- n 2))))))
</syntaxhighlight>
Iterative:
<syntaxhighlight lang="clojure">
(= fib (fn (n)
(let p0 0)
(let p1 1)
(while (< 0 n)
(= n (- n 1))
(let tmp (+ p0 p1))
(= p0 p1)
(= p1 tmp))
p0))
</syntaxhighlight>
 
=={{header|Fermat}}==
<syntaxhighlight lang="fermat">Func Fibonacci(n) = if n<0 then -(-1)^n*Fibonacci(-n) else if n<2 then n else
Array fib[n+1];
fib[1] := 0;
Line 4,844 ⟶ 6,381:
=={{header|Fexl}}==
 
<syntaxhighlight lang=Fexl"fexl">
# (fib n) = the nth Fibonacci number
\fib=
Line 4,890 ⟶ 6,427:
=={{header|Fish}}==
Outputs Fibonacci numbers until stopped.
<syntaxhighlight lang=Fish"fish">10::n' 'o&+&$10.</syntaxhighlight>
 
=={{header|FOCAL}}==
<syntaxhighlight lang="focal">01.10 TYPE "FIBONACCI NUMBERS" !
01.20 ASK "N =", N
01.30 SET A=0
Line 4,910 ⟶ 6,447:
 
=={{header|Forth}}==
<syntaxhighlight lang="forth">: fib ( n -- fib )
0 1 rot 0 ?do over + swap loop drop ;</syntaxhighlight>
 
Or, for negative-index support:
 
<syntaxhighlight lang="forth">: fib ( n -- Fn ) 0 1 begin
rot dup 0 = if drop drop exit then
dup 0 > if 1 - rot rot dup rot +
Line 4,923 ⟶ 6,460:
Since there are only a fixed and small amount of Fibonacci numbers that fit in a machine word, this FORTH version creates a table of Fibonacci numbers at compile time. It stops compiling numbers when there is arithmetic overflow (the number turns negative, indicating overflow.)
 
<syntaxhighlight lang="forth">: F-start, here 1 0 dup , ;
: F-next, over + swap
dup 0> IF dup , true ELSE false THEN ;
Line 4,943 ⟶ 6,480:
=={{header|Fortran}}==
===FORTRAN IV===
<syntaxhighlight lang="fortran">C FIBONACCI SEQUENCE - FORTRAN IV
NN=46
DO 1 I=0,NN
Line 4,983 ⟶ 6,520:
</pre>
===FORTRAN 77===
<syntaxhighlight lang="fortran">
FUNCTION IFIB(N)
IF (N.EQ.0) THEN
Line 5,010 ⟶ 6,547:
</syntaxhighlight>
Test program
<syntaxhighlight lang="fortran">
EXTERNAL IFIB
CHARACTER*10 LINE
Line 5,042 ⟶ 6,579:
===Recursive===
In ISO Fortran 90 or later, use a RECURSIVE function:
<syntaxhighlight lang="fortran">module fibonacci
contains
recursive function fibR(n) result(fib)
Line 5,056 ⟶ 6,593:
===Iterative===
In ISO Fortran 90 or later:
<syntaxhighlight lang="fortran"> function fibI(n)
integer, intent(in) :: n
integer, parameter :: fib0 = 0, fib1 = 1
Line 5,078 ⟶ 6,615:
 
Test program
<syntaxhighlight lang="fortran">program fibTest
use fibonacci
Line 5,103 ⟶ 6,640:
=={{header|Free Pascal}}==
''See also: [[#Pascal|Pascal]]''
<syntaxhighlight lang=Pascal"pascal">type
/// domain for Fibonacci function
/// where result is within nativeUInt
Line 5,143 ⟶ 6,680:
fibonacci := f[previous];
end;</syntaxhighlight>
 
=={{header|FreeBASIC}}==
Extended sequence coded big integer.
<syntaxhighlight lang=FreeBASIC>'Fibonacci extended
'Freebasic version 24 Windows
Dim Shared ADDQmod(0 To 19) As Ubyte
Dim Shared ADDbool(0 To 19) As Ubyte
 
For z As Integer=0 To 19
ADDQmod(z)=(z Mod 10+48)
ADDbool(z)=(-(10<=z))
Next z
 
Function plusINT(NUM1 As String,NUM2 As String) As String
Dim As Byte flag
#macro finish()
three=Ltrim(three,"0")
If three="" Then Return "0"
If flag=1 Then Swap NUM2,NUM1
Return three
Exit Function
#endmacro
var lenf=Len(NUM1)
var lens=Len(NUM2)
If lens>lenf Then
Swap NUM2,NUM1
Swap lens,lenf
flag=1
End If
var diff=lenf-lens-Sgn(lenf-lens)
var three="0"+NUM1
var two=String(lenf-lens,"0")+NUM2
Dim As Integer n2
Dim As Ubyte addup,addcarry
addcarry=0
For n2=lenf-1 To diff Step -1
addup=two[n2]+NUM1[n2]-96
three[n2+1]=addQmod(addup+addcarry)
addcarry=addbool(addup+addcarry)
Next n2
If addcarry=0 Then
finish()
End If
If n2=-1 Then
three[0]=addcarry+48
finish()
End If
For n2=n2 To 0 Step -1
addup=two[n2]+NUM1[n2]-96
three[n2+1]=addQmod(addup+addcarry)
addcarry=addbool(addup+addcarry)
Next n2
three[0]=addcarry+48
finish()
End Function
 
Function fibonacci(n As Integer) As String
Dim As String sl,l,term
sl="0": l="1"
If n=1 Then Return "0"
If n=2 Then Return "1"
n=n-2
For x As Integer= 1 To n
term=plusINT(l,sl)
sl=l
l=term
Next x
Function =term
End Function
 
'============== EXAMPLE ===============
print "THE SEQUENCE TO 10:"
print
For n As Integer=1 To 10
Print "term";n;": "; fibonacci(n)
Next n
print
print "Selected Fibonacci number"
print "Fibonacci 500"
print
print fibonacci(500)
Sleep</syntaxhighlight>
{{out}}
<pre>THE SEQUENCE TO 10:
 
term 1: 0
term 2: 1
term 3: 1
term 4: 2
term 5: 3
term 6: 5
term 7: 8
term 8: 13
term 9: 21
term 10: 34
 
Selected Fibonacci number
Fibonacci 500
 
86168291600238450732788312165664788095941068326060883324529903470149056115823592
713458328176574447204501</pre>
 
=={{header|Frink}}==
All of Frink's integers can be arbitrarily large.
<syntaxhighlight lang="frink">
fibonacciN[n] :=
{
Line 5,268 ⟶ 6,700:
=={{header|FRISC Assembly}}==
To find the nth Fibonacci number, call this subroutine with n in register R0: the answer will be returned in R0 too. Contents of other registers are preserved.
<syntaxhighlight lang="friscasm">FIBONACCI PUSH R1
PUSH R2
PUSH R3
Line 5,294 ⟶ 6,726:
=={{header|FunL}}==
=== Recursive ===
<syntaxhighlight lang="funl">def
fib( 0 ) = 0
fib( 1 ) = 1
Line 5,300 ⟶ 6,732:
 
=== Tail Recursive ===
<syntaxhighlight lang="funl">def fib( n ) =
def
_fib( 0, prev, _ ) = prev
Line 5,309 ⟶ 6,741:
 
=== Lazy List ===
<syntaxhighlight lang="funl">val fib =
def _fib( a, b ) = a # _fib( b, a + b )
 
Line 5,323 ⟶ 6,755:
 
=== Iterative ===
<syntaxhighlight lang="funl">def fib( n ) =
a, b = 0, 1
 
Line 5,332 ⟶ 6,764:
 
=== Binet's Formula ===
<syntaxhighlight lang="funl">import math.sqrt
 
def fib( n ) =
Line 5,339 ⟶ 6,771:
 
=== Matrix Exponentiation ===
<syntaxhighlight lang="funl">def mul( a, b ) =
res = array( a.length(), b(0).length() )
 
Line 5,379 ⟶ 6,811:
=== Iterative ===
 
<syntaxhighlight lang=Futhark"futhark">
fun main(n: int): int =
loop((a,b) = (0,1)) = for _i < n do
Line 5,388 ⟶ 6,820:
=={{header|FutureBasic}}==
=== Iterative ===
<syntaxhighlight lang="futurebasic">window 1, @"Fibonacci Sequence", (0,0,480,620)
 
local fn Fibonacci( n as long ) as long
Line 5,466 ⟶ 6,898:
=== Recursive ===
Cost is a time penalty
<syntaxhighlight lang="futurebasic">
local fn Fibonacci( n as NSInteger ) as NSInteger
NSInteger result
Line 5,535 ⟶ 6,967:
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Fibonacci_numbers}}
Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation &mdash;i.e. XML, JSON&mdash; they are intended for storage and transfer purposes more than visualization and edition.
 
=== Recursive ===
Programs in Fōrmulæ are created/edited online in its [https://formulae.org website], However they run on execution servers. By default remote servers are used, but they are limited in memory and processing power, since they are intended for demonstration and casual use. A local server can be downloaded and installed, it has no limitations (it runs in your own computer). Because of that, example programs can be fully visualized and edited, but some of them will not run if they require a moderate or heavy computation/memory resources, and no local server is being used.
 
Recursive version is slow, it is O(2<sup>n</sup>), or of exponential order.
 
[[File:Fōrmulæ - Fibonacci sequence 01.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 02.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
It is because it makes a lot of recursive calls.
In '''[https://formulae.org/?example=Fibonacci_numbers this]''' page you can see the program(s) related to this task and their results.
 
To illustrate this, the following is a functions that makes a tree or the recursive calls:
 
[[File:Fōrmulæ - Fibonacci sequence 03.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 04.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 05.png]]
 
=== Iterative (3 variables) ===
 
It is O(n), or of linear order.
 
[[File:Fōrmulæ - Fibonacci sequence 06.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 07.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=== Iterative (2 variables) ===
 
It is O(n), or of linear order.
 
[[File:Fōrmulæ - Fibonacci sequence 08.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 09.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=== Iterative, using a list ===
 
It is O(n), or of linear order.
 
[[File:Fōrmulæ - Fibonacci sequence 10.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 11.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=== Using matrix multiplication ===
 
[[File:Fōrmulæ - Fibonacci sequence 12.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 13.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=== Divide and conquer ===
 
It is an optimized version of the matrix multiplication algorithm, with an order of O(lg(n))
 
[[File:Fōrmulæ - Fibonacci sequence 14.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 15.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=== Closed-form ===
 
It has an order of O(lg(n))
 
[[File:Fōrmulæ - Fibonacci sequence 16.png]]
 
[[File:Fōrmulæ - Fibonacci sequence 17.png]]
 
[[File:Fōrmulæ - Fibonacci sequence result.png]]
 
=={{header|GAP}}==
<syntaxhighlight lang="gap">fib := function(n)
local a;
a := [[0, 1], [1, 1]]^n;
Line 5,548 ⟶ 7,054:
end;</syntaxhighlight>
GAP has also a buit-in function for that.
<syntaxhighlight lang="gap">Fibonacci(n);</syntaxhighlight>
 
=={{header|Gecho}}==
<syntaxhighlight lang="gecho">0 1 dup wover + dup wover + dup wover + dup wover +</syntaxhighlight>
Prints the first several fibonacci numbers...
 
=={{header|GFA Basic}}==
 
<lang>
'
' Compute nth Fibonacci number
'
' open a window for display
OPENW 1
CLEARW 1
' Display some fibonacci numbers
' Fib(46) is the largest number GFA Basic can reach
' (long integers are 4 bytes)
FOR i%=0 TO 46
PRINT "fib(";i%;")=";@fib(i%)
NEXT i%
' wait for a key press and tidy up
~INP(2)
CLOSEW 1
'
' Function to compute nth fibonacci number
' n must be in range 0 to 46, inclusive
'
FUNCTION fib(n%)
LOCAL n0%,n1%,nn%,i%
n0%=0
n1%=1
SELECT n%
CASE 0
RETURN n0%
CASE 1
RETURN n1%
DEFAULT
FOR i%=2 TO n%
nn%=n0%+n1%
n0%=n1%
n1%=nn%
NEXT i%
RETURN nn%
ENDSELECT
ENDFUNC
</syntaxhighlight>
 
=={{header|GML}}==
<syntaxhighlight lang="gml">///fibonacci(n)
 
<syntaxhighlight lang=gml>///fibonacci(n)
//Returns the nth fibonacci number
 
Line 5,626 ⟶ 7,089:
=={{header|Go}}==
=== Recursive ===
<syntaxhighlight lang="go">func fib(a int) int {
if a < 2 {
return a
Line 5,633 ⟶ 7,096:
}</syntaxhighlight>
=== Iterative ===
<syntaxhighlight lang="go">import (
"math/big"
)
Line 5,649 ⟶ 7,112:
}</syntaxhighlight>
=== Iterative using a closure ===
<syntaxhighlight lang="go">func fibNumber() func() int {
fib1, fib2 := 0, 1
return func() int {
Line 5,666 ⟶ 7,129:
}</syntaxhighlight>
=== Using a goroutine and channel ===
<syntaxhighlight lang="go">func fib(c chan int) {
a, b := 0, 1
for {
Line 5,682 ⟶ 7,145:
}
</syntaxhighlight>
 
=={{header|Grain}}==
=== Recursive ===
<syntaxhighlight lang="haskell">
import String from "string"
import File from "sys/file"
let rec fib = n => if (n < 2) {
n
} else {
fib(n - 1) + fib(n - 2)
}
for (let mut i = 0; i <= 20; i += 1) {
File.fdWrite(File.stdout, Pervasives.toString(fib(i)))
ignore(File.fdWrite(File.stdout, " "))
}
</syntaxhighlight>
=== Iterative ===
<syntaxhighlight lang="haskell">
import File from "sys/file"
let fib = j => {
let mut fnow = 0, fnext = 1
for (let mut n = 0; n <= j; n += 1) {
if (n == 0 || n == 1) {
let output1 = " " ++ toString(n)
ignore(File.fdWrite(File.stdout, output1))
} else {
let tempf = fnow + fnext
fnow = fnext
fnext = tempf
let output2 = " " ++ toString(fnext)
ignore(File.fdWrite(File.stdout, output2))
}
}
}
fib(20)
</syntaxhighlight>
{{out}}
=== Iterative with Buffer ===
<syntaxhighlight lang="haskell">
import Buffer from "buffer"
import String from "string"
let fib = j => {
// set-up minimal, growable buffer
let buf = Buffer.make(j * 2)
let mut fnow = 0, fnext = 1
for (let mut n = 0; n <= j; n += 1) {
if (n == 0 || n == 1) {
Buffer.addChar(' ', buf)
Buffer.addString(toString(n), buf)
} else {
let tempf = fnow + fnext
fnow = fnext
fnext = tempf
Buffer.addChar(' ', buf)
Buffer.addString(toString(fnext), buf)
}
}
// stringify buffer and return
Buffer.toString(buf)
}
let output = fib(20)
print(output)
</syntaxhighlight>
{{out}}<pre>
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
 
=={{header|Groovy}}==
Line 5,687 ⟶ 7,216:
=== Recursive ===
A recursive closure must be ''pre-declared''.
<syntaxhighlight lang="groovy">def rFib
rFib = {
it == 0 ? 0
Line 5,697 ⟶ 7,226:
 
=== Iterative ===
<syntaxhighlight lang="groovy">def iFib = {
it == 0 ? 0
: it == 1 ? 1
Line 5,705 ⟶ 7,234:
 
=== Analytic ===
<syntaxhighlight lang="groovy">final φ = (1 + 5**(1/2))/2
def aFib = { (φ**it - (-φ)**(-it))/(5**(1/2)) as BigInteger }</syntaxhighlight>
 
Test program:
<syntaxhighlight lang="groovy">def time = { Closure c ->
def start = System.currentTimeMillis()
def result = c()
Line 5,735 ⟶ 7,264:
=={{header|Harbour}}==
===Recursive===
<syntaxhighlight lang=Harbour"harbour">
#include "harbour.ch"
Function fibb(a,b,n)
Line 5,742 ⟶ 7,271:
 
===Iterative===
<syntaxhighlight lang=Harbour"harbour">
#include "harbour.ch"
Function fibb(n)
Line 5,758 ⟶ 7,287:
{{Works with|exact-real|0.12.5.1}}
Using Binet's formula and [https://hackage.haskell.org/package/exact-real-0.12.5.1/docs/Data-CReal.html exact real arithmetic] library we can calculate arbitrary Fibonacci number '''exactly'''.
<syntaxhighlight lang="haskell">
import Data.CReal
 
Line 5,767 ⟶ 7,296:
</syntaxhighlight>
Let's try it for large numbers:
<syntaxhighlight lang="haskell">
λ> fib 10 :: CReal 0
55
Line 5,785 ⟶ 7,314:
Simple definition, very inefficient.
 
<syntaxhighlight lang="haskell">fib x =
if x < 1
then 0
Line 5,794 ⟶ 7,323:
===Recursive with Memoization===
Very fast.
<syntaxhighlight lang="haskell">fib x =
if x < 1
then 0
Line 5,805 ⟶ 7,334:
===Recursive with Memoization using memoized library===
Even faster and simpler is to use a defined memoizer (e.g. from MemoTrie package):
<syntaxhighlight lang="haskell">import Data.MemoTrie
fib :: Integer -> Integer
fib = memo f where
Line 5,812 ⟶ 7,341:
f n = fib (n-1) + fib (n-2)</syntaxhighlight>
You can rewrite this without introducing f explicitly
<syntaxhighlight lang="haskell">import Data.MemoTrie
fib :: Integer -> Integer
fib = memo $ \x -> case x of
Line 5,819 ⟶ 7,348:
n -> fib (n-1) + fib (n-2)</syntaxhighlight>
Or using LambdaCase extension you can write it even shorter:
<syntaxhighlight lang="haskell">{-# Language LambdaCase #-}
import Data.MemoTrie
fib :: Integer -> Integer
Line 5,827 ⟶ 7,356:
n -> fib (n-1) + fib (n-2)</syntaxhighlight>
The version that supports negative numbers:
<syntaxhighlight lang="haskell">{-# Language LambdaCase #-}
import Data.MemoTrie
fib :: Integer -> Integer
Line 5,837 ⟶ 7,366:
 
===Iterative===
<syntaxhighlight lang="haskell">fib n = go n 0 1
where
go n a b
Line 5,846 ⟶ 7,375:
This is a standard example how to use lazy lists. Here's the (infinite) list of all Fibonacci numbers:
 
<syntaxhighlight lang="haskell">fib = 0 : 1 : zipWith (+) fib (tail fib)</syntaxhighlight>
Or alternatively:
<syntaxhighlight lang="haskell">fib = 0 : 1 : (zipWith (+) <*> tail) fib </syntaxhighlight>
 
The ''n''th Fibonacci number is then just <code plang="haskell">fib !! n</code>. The above is equivalent to
 
<syntaxhighlight lang="haskell">fib = 0 : 1 : next fib where next (a: t@(b:_)) = (a+b) : next t</syntaxhighlight>
 
Also
 
<syntaxhighlight lang="haskell">fib = 0 : scanl (+) 1 fib</syntaxhighlight>
 
==== As a fold ====
Accumulator holds last two members of the series:
 
<syntaxhighlight lang="haskell">import Data.List (foldl') --'
 
fib :: Integer -> Integer
Line 5,875 ⟶ 7,404:
we can simply write:
 
<syntaxhighlight lang="haskell">import Data.List (transpose)
 
fib
Line 5,926 ⟶ 7,455:
=== With recurrence relations ===
Using <code>Fib[m=3n+r]</code> [http://en.wikipedia.org/wiki/Fibonacci_number#Other_identities recurrence identities]:
<syntaxhighlight lang="haskell">import Control.Arrow ((&&&))
 
fibstep :: (Integer, Integer) -> (Integer, Integer)
Line 5,965 ⟶ 7,494:
 
<code>(fibN2 n)</code> directly calculates a pair <code>(f,g)</code> of two consecutive Fibonacci numbers, <code>(Fib[n], Fib[n+1])</code>, from recursively calculated such pair at about <code>n/3</code>:
<syntaxhighlight lang="haskell"> *Main> (length &&& take 20) . show . fst $ fibN2 (10^6)
(208988,"19532821287077577316")</syntaxhighlight>
The above should take less than 0.1s to calculate on a modern box.
Line 5,971 ⟶ 7,500:
Other identities that could also be used are [http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form here]. In particular, for <i>(n-1,n) ---> (2n-1,2n)</i> transition which is equivalent to the matrix exponentiation scheme, we have
 
<syntaxhighlight lang="haskell">f (n,(a,b)) = (2*n,(a*a+b*b,2*a*b+b*b)) -- iterate f (1,(0,1)) ; b is nth</syntaxhighlight>
 
and for <i>(n,n+1) ---> (2n,2n+1)</i> (derived from d'Ocagne's identity, for example),
 
<syntaxhighlight lang="haskell">g (n,(a,b)) = (2*n,(2*a*b-a*a,a*a+b*b)) -- iterate g (1,(1,1)) ; a is nth</syntaxhighlight>
 
=={{header|Haxe}}==
=== Iterative ===
 
<syntaxhighlight lang="haxe">static function fib(steps:Int, handler:Int->Void)
{
var current = 0;
Line 5,997 ⟶ 7,526:
 
=== As Iterator ===
<syntaxhighlight lang="haxe">class FibIter
{
private var current = 0;
Line 6,018 ⟶ 7,547:
 
Used like:
<syntaxhighlight lang="haxe">for (i in new FibIter(10))
Sys.println(i);</syntaxhighlight>
 
=={{header|HicEst}}==
<syntaxhighlight lang="hicest">REAL :: Fibonacci(10)
 
Fibonacci = ($==2) + Fibonacci($-1) + Fibonacci($-2)
Line 6,028 ⟶ 7,557:
 
=={{header|Hoon}}==
<syntaxhighlight lang="hoon">|= n=@ud
=/ a=@ud 0
=/ b=@ud 1
Line 6,037 ⟶ 7,566:
=={{header|Hope}}==
===Recursive===
<syntaxhighlight lang="hope">dec f : num -> num;
--- f 0 <= 0;
--- f 1 <= 1;
Line 6,043 ⟶ 7,572:
 
===Tail-recursive===
<syntaxhighlight lang="hope">dec fib : num -> num;
--- fib n <= l (1, 0, n)
whererec l == \(a,b,succ c) => if c<1 then a else l((a+b),a,c)
Line 6,050 ⟶ 7,579:
=== With lazy lists ===
This language, being one of Haskell's ancestors, also has lazy lists. Here's the (infinite) list of all Fibonacci numbers:
<syntaxhighlight lang="hope">dec fibs : list num;
--- fibs <= fs whererec fs == 0::1::map (+) (tail fs||fs);</syntaxhighlight>
The ''n''th Fibonacci number is then just <code plang="hope">fibs @ n</code>.
Line 6,056 ⟶ 7,585:
=={{header|Hy}}==
Recursive implementation.
<syntaxhighlight lang="clojure">(defn fib [n]
(if (< n 2)
n
Line 6,065 ⟶ 7,594:
computes fib(1000) if there is no integer argument.
 
<syntaxhighlight lang=Icon"icon">procedure main(args)
write(fib(integer(!args) | 1000)
end
Line 6,087 ⟶ 7,616:
This example computes fib(1000000) if there is no integer argument.
 
<syntaxhighlight lang=Icon"icon">procedure main(args)
write(fib(integer(!args) | 1000000))
end
Line 6,107 ⟶ 7,636:
=={{header|IDL}}==
===Recursive===
<syntaxhighlight lang="idl">function fib,n
if n lt 3 then return,1L else return, fib(n-1)+fib(n-2)
end</syntaxhighlight>
Line 6,114 ⟶ 7,643:
 
===Iterative===
<syntaxhighlight lang="idl">function fib,n
psum = (csum = 1uL)
if n lt 3 then return,csum
Line 6,128 ⟶ 7,657:
 
===Analytic===
<syntaxhighlight lang="idl">function fib,n
q=1/( p=(1+sqrt(5))/2 )
return,round((p^n+q^n)/sqrt(5))
Line 6,138 ⟶ 7,667:
 
===Analytic===
<syntaxhighlight lang="idris">fibAnalytic : Nat -> Double
fibAnalytic n =
floor $ ((pow goldenRatio n) - (pow (-1.0/goldenRatio) n)) / sqrt(5)
Line 6,144 ⟶ 7,673:
goldenRatio = (1.0 + sqrt(5)) / 2.0</syntaxhighlight>
===Recursive===
<syntaxhighlight lang="idris">fibRecursive : Nat -> Nat
fibRecursive Z = Z
fibRecursive (S Z) = (S Z)
fibRecursive (S (S n)) = fibRecursive (S n) + fibRecursive n </syntaxhighlight>
===Iterative===
<syntaxhighlight lang="idris">fibIterative : Nat -> Nat
fibIterative n = fibIterative' n Z (S Z)
where fibIterative' : Nat -> Nat -> Nat -> Nat
Line 6,155 ⟶ 7,684:
fibIterative' (S n) a b = fibIterative' n b (a + b) </syntaxhighlight>
===Lazy===
<syntaxhighlight lang="idris">fibLazy : Lazy (List Nat)
fibLazy = 0 :: 1 :: zipWith (+) fibLazy (
case fibLazy of
Line 6,162 ⟶ 7,691:
 
=={{header|J}}==
The [[jhttps://code.jsoftware.com/wiki/Essays/Fibonacci_Sequence| Fibonacci Sequence essay]] on the J Wiki presents a number of different ways of obtaining the nth Fibonacci number. Here is one:
 
<syntaxhighlight lang=j> fibN=: (-&2 +&$: -&1)^:(1&<) M."0</syntaxhighlight>
This implementation is doubly recursive except that results are cached across function calls:
<syntaxhighlight lang="j">fibN=: (-&2 +&$: <:)^:(1&<) M."0</syntaxhighlight>
Iteration:
<syntaxhighlight lang="j">fibN=: [: {."1 +/\@|.@]^:[&0 1</syntaxhighlight>
'''Examples:'''
<syntaxhighlight lang="j"> fibN 12
144
fibN i.31
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040</syntaxhighlight>
 
(This implementation is doubly recursive except that results are cached across function calls.)
 
=={{header|Java}}==
===Iterative===
<syntaxhighlight lang="java">public static long itFibN(int n)
{
if (n < 2)
Line 6,190 ⟶ 7,721:
}</syntaxhighlight>
 
<syntaxhighlight lang="java">
/**
* O(log(n))
Line 6,222 ⟶ 7,753:
 
===Recursive===
<syntaxhighlight lang="java">public static long recFibN(final int n)
{
return (n < 2) ? n : recFibN(n - 1) + recFibN(n - 2);
Line 6,229 ⟶ 7,760:
===Caching-recursive===
A variant on recursive, that caches previous results, reducing complexity from O(n<sup>2</sup>) to simply O(n). Leveraging Java’s Map.computeIfAbsent makes this thread-safe, and the implementation pretty trivial.
<syntaxhighlight lang="java">public class Fibonacci {
 
static final Map<Integer, Long> cache = new HashMap<>();
Line 6,249 ⟶ 7,780:
===Analytic===
This method works up to the 92<sup>nd</sup> Fibonacci number. After that, it goes out of range.
<syntaxhighlight lang="java">public static long anFibN(final long n)
{
double p = (1 + Math.sqrt(5)) / 2;
Line 6,256 ⟶ 7,787:
}</syntaxhighlight>
===Tail-recursive===
<syntaxhighlight lang="java">public static long fibTailRec(final int n)
{
return fibInner(0, 1, n);
Line 6,266 ⟶ 7,797:
}</syntaxhighlight>
===Streams===
<syntaxhighlight lang="java5">
import java.util.function.LongUnaryOperator;
import java.util.stream.LongStream;
Line 6,291 ⟶ 7,822:
====Recursive====
Basic recursive function:
<syntaxhighlight lang="javascript">function fib(n) {
return n<2?n:fib(n-1)+fib(n-2);
}</syntaxhighlight>
Can be rewritten as:
<syntaxhighlight lang="javascript">function fib(n) {
if (n<2) { return n; } else { return fib(n-1)+fib(n-2); }
}</syntaxhighlight>
 
One possibility familiar to Scheme programmers is to define an internal function for iteration through anonymous tail recursion:
<syntaxhighlight lang="javascript">function fib(n) {
return function(n,a,b) {
return n>0 ? arguments.callee(n-1,b,a+b) : a;
Line 6,307 ⟶ 7,838:
 
===Iterative===
<syntaxhighlight lang="javascript">function fib(n) {
var a = 0, b = 1, t;
while (n-- > 0) {
Line 6,322 ⟶ 7,853:
With the keys of a dictionary,
 
<syntaxhighlight lang="javascript">var fib = (function(cache){
return cache = cache || {}, function(n){
if (cache[n]) return cache[n];
Line 6,333 ⟶ 7,864:
with the indices of an array,
 
<syntaxhighlight lang="javascript">(function () {
'use strict';
 
Line 6,357 ⟶ 7,888:
 
====Y-Combinator====
<syntaxhighlight lang="javascript">function Y(dn) {
return (function(fn) {
return fn(fn);
Line 6,376 ⟶ 7,907:
 
====Generators====
<syntaxhighlight lang="javascript">function* fibonacciGenerator() {
var prev = 0;
var curr = 1;
Line 6,394 ⟶ 7,925:
we can use an accumulating fold.
 
<syntaxhighlight lang=JavaScript"javascript">(() => {
'use strict';
 
Line 6,434 ⟶ 7,965:
{{Trans|Haskell}} (Memoized fold example)
 
<syntaxhighlight lang=JavaScript"javascript">(() => {
'use strict';
 
Line 6,462 ⟶ 7,993:
=={{header|Joy}}==
===Recursive===
<syntaxhighlight lang="joy">DEFINE fib == [small] [] [pred dup pred] [+] binrec.</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang="joy">DEFINE fib == [1 0] dip [swap [+] unary] times popd.</syntaxhighlight>
 
=={{header|jq}}==
Line 6,474 ⟶ 8,005:
so using it, the following algorithms only give exact answers up to fib(78). By contrast,
using the Go implementation of jq and the definition of nth_fib given below:
<syntaxhighlight lang="jq">
nth_fib(pow(2;20)) | tostring | [length, .[:10], .[-10:]]
</syntaxhighlight>
Line 6,488 ⟶ 8,019:
 
===Recursive===
<syntaxhighlight lang="jq">def nth_fib_naive(n):
if (n < 2) then n
else nth_fib_naive(n - 1) + nth_fib_naive(n - 2)
Line 6,494 ⟶ 8,025:
===Tail Recursive===
Recent versions of jq (after July 1, 2014) include basic optimizations for tail recursion, and nth_fib is defined here to take advantage of TCO. For example, nth_fib(10000000) completes with only 380KB (that's K) of memory. However nth_fib can also be used with earlier versions of jq.
<syntaxhighlight lang="jq">def nth_fib(n):
# input: [f(i-2), f(i-1), countdown]
def fib: (.[0] + .[1]) as $sum
Line 6,504 ⟶ 8,035:
</syntaxhighlight>
 
Example:<syntaxhighlight lang="jq">
(range(0;5), 50) | [., nth_fib(.)]
</syntaxhighlight>
yields: <syntaxhighlight lang="jq">[0,0]
[1,1]
[2,1]
Line 6,515 ⟶ 8,046:
 
===Binet's Formula===
<syntaxhighlight lang="jq">def fib_binet(n):
(5|sqrt) as $rt
| ((1 + $rt)/2) as $phi
Line 6,524 ⟶ 8,055:
 
===Generator===
The following is a jq generator which produces the first n terms of the Fibonacci sequence efficiently, one by one. Notice that it is simply a variant of the above tail-recursive function. The function is in effect turned into a generator by changing "( _ | fib )" to "$sum, (_ | fib)".<syntaxhighlight lang="jq"># Generator
def fibonacci(n):
# input: [f(i-2), f(i-1), countdown]
Line 6,535 ⟶ 8,066:
=={{header|Julia}}==
===Recursive===
<syntaxhighlight lang=Julia"julia">fib(n) = n < 2 ? n : fib(n-1) + fib(n-2)</syntaxhighlight>
===Iterative===
<syntaxhighlight lang=Julia"julia">function fib(n)
x,y = (0,1)
for i = 1:n x,y = (y, x+y) end
Line 6,543 ⟶ 8,074:
end</syntaxhighlight>
===Matrix form===
<syntaxhighlight lang=Julia"julia">fib(n) = ([1 1 ; 1 0]^n)[1,2]</syntaxhighlight>
 
=={{header|K}}==
{{works with|Kona}}
 
===Recursive===
<syntaxhighlight lang=K"k">{:[x<3;1;_f[x-1]+_f[x-2]]}</syntaxhighlight>
 
===Recursive with memoization===
Using a (global) dictionary c.
 
<syntaxhighlight lang=K"k">{c::.();{v:c[a:`$$x];:[x<3;1;:[_n~v;c[a]:_f[x-1]+_f[x-2];v]]}x}</syntaxhighlight>
 
===Analytic===
<syntaxhighlight lang=K"k">phi:(1+_sqrt(5))%2
{_((phi^x)-((1-phi)^x))%_sqrt[5]}</syntaxhighlight>
 
===Sequence to n===
{{works with|Kona}} {{works with|ngn/k}}
<syntaxhighlight lang=K>{(x(|+\)\1 1)[;1]}</syntaxhighlight>
<syntaxhighlight lang=K"k">{(x{x,(|+/-2#x}/!2\)\1 1)[;1]}</syntaxhighlight>
<syntaxhighlight lang="k">{x{x,+/-2#x}/!2}</syntaxhighlight>
 
=={{header|Kabap}}==
 
===Sequence to n===
<syntaxhighlight lang=Kabap"kabap">
// Calculate the $n'th Fibonacci number
 
Line 6,605 ⟶ 8,138:
 
=={{header|Klingphix}}==
<syntaxhighlight lang="text">:Fibonacci
dup 0 less
( ["Invalid argument"]
Line 6,618 ⟶ 8,151:
 
=={{header|Kotlin}}==
<syntaxhighlight lang="kotlin">enum class Fibonacci {
ITERATIVE {
override fun get(n: Int): Long = if (n < 2) {
Line 6,661 ⟶ 8,194:
 
=={{header|L++}}==
<syntaxhighlight lang="lisp">(defn int fib (int n) (return (? (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))))
(main (prn (fib 30)))</syntaxhighlight>
 
Line 6,667 ⟶ 8,200:
{{VI solution|LabVIEW_Fibonacci_sequence.png}}
 
=={{header|lambdatalkLambdatalk}}==
 
<syntaxhighlight lang="scheme">
1) basic version
{def fib1
Line 6,753 ⟶ 8,286:
{fib5 1000} -> 4.346655768693743e+208 (CPU ~ 1ms)
 
</syntaxhighlight>
 
=={{header|Lang}}==
===Iterative===
<syntaxhighlight lang="lang">
fp.fib = ($n) -> {
if($n < 2) {
return $n
}
$prev = 1
$cur = 1
$i = 2
while($i < $n) {
$tmp = $cur
$cur += $prev
$prev = $tmp
$i += 1
}
return $cur
}
</syntaxhighlight>
 
===Recursive===
<syntaxhighlight lang="lang">
fp.fib = ($n) -> {
if($n < 2) {
return $n
}
return parser.op(fp.fib($n - 1) + fp.fib($n - 2))
}
</syntaxhighlight>
 
=={{header|Lang5}}==
<syntaxhighlight lang="lang5">[] '__A set : dip swap __A swap 2 compress collapse '__A set execute
__A -1 extract nip ; : nip swap drop ; : tuck swap over ;
: -rot rot rot ; : 0= 0 == ; : 1+ 1 + ; : 1- 1 - ; : sum '+ reduce ;
Line 6,765 ⟶ 8,332:
 
=={{header|langur}}==
<syntaxhighlight lang="langur">val .fibonacci = ffn(.x) { if(.x < 2: .x ; self(.x - 1) + self(.x - 2)) }
 
writeln map .fibonacci, series 2..20</syntaxhighlight>
Line 6,773 ⟶ 8,340:
 
=={{header|Lasso}}==
<syntaxhighlight lang=Lasso"lasso">
define fibonacci(n::integer) => {
 
Line 6,802 ⟶ 8,369:
 
===Recursive===
<syntaxhighlight lang="latitude">fibo := {
takes '[n].
if { n <= 1. } then {
Line 6,812 ⟶ 8,379:
 
===Memoization===
<syntaxhighlight lang="latitude">fibo := {
takes '[n].
cache := here cache.
Line 6,834 ⟶ 8,401:
It runs on Lean 3.4.2:
 
<syntaxhighlight lang=Lean"lean">
-- Our first implementation is the usual recursive definition:
def fib1 : ℕ → ℕ
Line 6,858 ⟶ 8,425:
It runs on Lean 4:
 
<syntaxhighlight lang=Lean"lean">
-- Naive version
def fib1 (n : Nat) : Nat :=
Line 6,884 ⟶ 8,451:
===Recursive===
 
<syntaxhighlight lang="lisp">
(defun fib
((0) 0)
Line 6,895 ⟶ 8,462:
===Iterative===
 
<syntaxhighlight lang="lisp">
(defun fib
((n) (when (>= n 0))
Line 6,908 ⟶ 8,475:
</syntaxhighlight>
 
=={{header|Liberty BASIC}}==
===Iterative/Recursive===
<syntaxhighlight lang=lb>
for i = 0 to 15
print fiboR(i),fiboI(i)
next i
function fiboR(n)
if n <= 1 then
fiboR = n
else
fiboR = fiboR(n-1) + fiboR(n-2)
end if
end function
function fiboI(n)
a = 0
b = 1
for i = 1 to n
temp = a + b
a = b
b = temp
next i
fiboI = a
end function
</syntaxhighlight>
{{out}}
<pre>
0 0
1 1
1 1
2 2
3 3
5 5
8 8
13 13
21 21
34 34
55 55
89 89
144 144
233 233
377 377
610 610
</pre>
===Iterative/Negative===
<syntaxhighlight lang=lb>
print "Rosetta Code - Fibonacci sequence": print
print " n Fn"
for x=-12 to 12 '68 max
print using("### ", x); using("##############", FibonacciTerm(x))
next x
print
[start]
input "Enter a term#: "; n$
n$=lower$(trim$(n$))
if n$="" then print "Program complete.": end
print FibonacciTerm(val(n$))
goto [start]
 
function FibonacciTerm(n)
n=int(n)
FTa=0: FTb=1: FTc=-1
select case
case n=0 : FibonacciTerm=0 : exit function
case n=1 : FibonacciTerm=1 : exit function
case n=-1 : FibonacciTerm=-1 : exit function
case n>1
for x=2 to n
FibonacciTerm=FTa+FTb
FTa=FTb: FTb=FibonacciTerm
next x
exit function
case n<-1
for x=-2 to n step -1
FibonacciTerm=FTa+FTc
FTa=FTc: FTc=FibonacciTerm
next x
exit function
end select
end function
</syntaxhighlight>
{{out}}
<pre>
Rosetta Code - Fibonacci sequence
 
n Fn
-12 -144
-11 -89
-10 -55
-9 -34
-8 -21
-7 -13
-6 -8
-5 -5
-4 -3
-3 -2
-2 -1
-1 -1
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
 
Enter a term#: 12
144
Enter a term#:
Program complete.
</pre>
 
=={{header|Lingo}}==
 
===Recursive===
<syntaxhighlight lang="lingo">on fib (n)
 
<syntaxhighlight lang=lingo>on fib (n)
if n<2 then return n
return fib(n-1)+fib(n-2)
Line 7,037 ⟶ 8,484:
 
===Iterative===
<syntaxhighlight lang="lingo">on fib (n)
 
<syntaxhighlight lang=lingo>on fib (n)
if n<2 then return n
fibPrev = 0
Line 7,051 ⟶ 8,497:
 
===Analytic===
<syntaxhighlight lang="lingo">on fib (n)
 
<syntaxhighlight lang=lingo>on fib (n)
sqrt5 = sqrt(5.0)
p = (1+sqrt5)/2
Line 7,060 ⟶ 8,505:
 
=={{header|Lisaac}}==
<syntaxhighlight lang=Lisaac"lisaac">- fib(n : UINTEGER_32) : UINTEGER_64 <- (
+ result : UINTEGER_64;
(n < 2).if {
Line 7,071 ⟶ 8,516:
 
=={{header|LiveCode}}==
<syntaxhighlight lang=LiveCode"livecode">-- Iterative, translation of the basic version.
function fibi n
put 0 into aa
Line 7,093 ⟶ 8,538:
 
=={{header|LLVM}}==
<syntaxhighlight lang="llvm">; This is not strictly LLVM, as it uses the C library function "printf".
; LLVM does not provide a way to print values, so the alternative would be
; to just load the string into memory, and that would be boring.
Line 7,179 ⟶ 8,624:
 
=={{header|Logo}}==
<syntaxhighlight lang="logo">to fib :n [:a 0] [:b 1]
to fib "loop
if :n < 1 [output :a]
make "fib1 0
output (fib :n-1 :b :a+:b)
make "fib2 1
end</syntaxhighlight>
 
type [You requested\ ]
type :loop
print [\ Fibonacci Numbers]
type :fib1
type [\ ]
type :fib2
type [\ ]
make "loop :loop - 2
repeat :loop [ make "fibnew :fib1 + :fib2 type :fibnew type [\ ] make "fib1 :fib2 make "fib2 :fibnew ]
print [\ ]
end
</syntaxhighlight>
 
=={{header|LOLCODE}}==
<syntaxhighlight lang=LOLCODE"lolcode">
HAI 1.2
HOW DUZ I fibonacci YR N
Line 7,206 ⟶ 8,666:
=={{header|LSL}}==
Rez a box on the ground, and add the following as a New Script.
<syntaxhighlight lang=LSL"lsl">integer Fibonacci(integer n) {
if(n<2) {
return n;
Line 7,262 ⟶ 8,722:
=={{header|Lua}}==
===Recursive===
<syntaxhighlight lang="lua">
--calculates the nth fibonacci number. Breaks for negative or non-integer n.
function fibs(n)
Line 7,270 ⟶ 8,730:
 
===Pedantic Recursive===
<syntaxhighlight lang="lua">
--more pedantic version, returns 0 for non-integer n
function pfibs(n)
Line 7,282 ⟶ 8,742:
 
===Tail Recursive===
<syntaxhighlight lang="lua">
function a(n,u,s) if n<2 then return u+s end return a(n-1,u+s,u) end
function trfib(i) return a(i-1,1,0) end
Line 7,288 ⟶ 8,748:
 
===Table Recursive===
<syntaxhighlight lang="lua">
fib_n = setmetatable({1, 1}, {__index = function(z,n) return n<=0 and 0 or z[n-1] + z[n-2] end})
</syntaxhighlight>
 
===Table Recursive 2===
<syntaxhighlight lang="lua">
-- table recursive done properly (values are actually saved into table;
-- also the first element of Fibonacci sequence is 0, so the initial table should be {0, 1}).
Line 7,306 ⟶ 8,766:
 
===Iterative===
<syntaxhighlight lang="lua">
function ifibs(n)
local p0,p1=0,1
Line 7,315 ⟶ 8,775:
 
=={{header|Luck}}==
<syntaxhighlight lang="luck">function fib(x: int): int = (
let cache = {} in
let fibc x = if x<=1 then x else (
Line 7,326 ⟶ 8,786:
 
=={{header|Lush}}==
<syntaxhighlight lang="lush">(de fib-rec (n)
(if (< n 2)
n
Line 7,333 ⟶ 8,793:
=={{header|M2000 Interpreter}}==
Return decimal type and use an Inventory (as closure) to store known return values. All closures are in scope in every recursive call (we use here lambda(), but we can use fib(), If we make Fib1=fib then we have to use lambda() for recursion.
<syntaxhighlight lang=M2000"m2000 Interpreterinterpreter">
Inventory K=0:=0,1:=1
fib=Lambda K (x as decimal)-> {
Line 7,350 ⟶ 8,810:
Here an example where we use a BigNum class to make a Group which hold a stack of values, and take 14 digits per item in stack. We can use inventory to hold groups, so we use the fast fib() function from code above, where we remove the type definition of Ret variable, and set two first items in inventory as groups.
 
<syntaxhighlight lang=M2000"m2000 Interpreterinterpreter">
 
Class BigNum {
Line 7,434 ⟶ 8,894:
 
=={{header|M4}}==
<syntaxhighlight lang="m4">define(`fibo',`ifelse(0,$1,0,`ifelse(1,$1,1,
`eval(fibo(decr($1)) + fibo(decr(decr($1))))')')')dnl
define(`loop',`ifelse($1,$2,,`$3($1) loop(incr($1),$2,`$3')')')dnl
Line 7,441 ⟶ 8,901:
=={{header|MAD}}==
 
<syntaxhighlight lang=MAD"mad"> NORMAL MODE IS INTEGER
INTERNAL FUNCTION(N)
Line 7,484 ⟶ 8,944:
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">
> f := n -> ifelse(n<3,1,f(n-1)+f(n-2));
> f(2);
Line 7,495 ⟶ 8,955:
The Wolfram Language already has a built-in function <tt>Fibonacci</tt>, but a simple recursive implementation would be
 
<syntaxhighlight lang="mathematica">fib[0] = 0
fib[1] = 1
fib[n_Integer] := fib[n - 1] + fib[n - 2]</syntaxhighlight>
Line 7,501 ⟶ 8,961:
An optimization is to cache the values already calculated:
 
<syntaxhighlight lang="mathematica">fib[0] = 0
fib[1] = 1
fib[n_Integer] := fib[n] = fib[n - 1] + fib[n - 2]</syntaxhighlight>
Line 7,507 ⟶ 8,967:
The above implementations may be too simplistic, as the first is incredibly slow for any reasonable range due to nested recursions and while the second is faster it uses an increasing amount of memory. The following uses recursion much more effectively while not using memory:
 
<syntaxhighlight lang="mathematica">fibi[prvprv_Integer, prv_Integer, rm_Integer] :=
If[rm < 1, prvprv, fibi[prv, prvprv + prv, rm - 1]]
fib[n_Integer] := fibi[0, 1, n]</syntaxhighlight>
Line 7,513 ⟶ 8,973:
However, the recursive approaches in Mathematica are limited by the limit set for recursion depth (default 1024 or 4096 for the above cases), limiting the range for 'n' to about 1000 or 2000. The following using an iterative approach has an extremely high limit (greater than a million):
 
<syntaxhighlight lang="mathematica">fib[n_Integer] := Block[{tmp, prvprv = 0, prv = 1},
For[i = 0, i < n, i++, tmp = prv; prv += prvprv; prvprv = tmp];
Return[prvprv]]</syntaxhighlight>
Line 7,519 ⟶ 8,979:
If one wanted a list of Fibonacci numbers, the following is quite efficient:
 
<syntaxhighlight lang="mathematica">fibi[{prvprv_Integer, prv_Integer}] := {prv, prvprv + prv}
fibList[n_Integer] := Map[Take[#, 1] &, NestList[fibi, {0, 1}, n]] // Flatten</syntaxhighlight>
 
Output from the last with "fibList[100]":
 
<syntaxhighlight lang="mathematica">{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, \
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, \
196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, \
Line 7,548 ⟶ 9,008:
The Wolfram Language can also solve recurrence equations using the built-in function <tt>RSolve</tt>
 
<syntaxhighlight lang="mathematica">fib[n] /. RSolve[{fib[n] == fib[n - 1] + fib[n - 2], fib[0] == 0,
fib[1] == 1}, fib[n], n][[1]]</syntaxhighlight>
 
Line 7,555 ⟶ 9,015:
This function can also be expressed as
 
<syntaxhighlight lang="mathematica">Fibonacci[n] // FunctionExpand // FullSimplify</syntaxhighlight>
 
which evaluates to
 
<syntaxhighlight lang="mathematica">(2^-n ((1 + Sqrt[5])^n - (-1 + Sqrt[5])^n Cos[n π]))/Sqrt[5]</syntaxhighlight>
 
and is defined for all real or complex values of n.
Line 7,568 ⟶ 9,028:
{{trans|Julia}}
 
<syntaxhighlight lang=MATLAB"matlab">function f = fib(n)
f = [1 1 ; 1 0]^(n-1);
Line 7,576 ⟶ 9,036:
 
===Iterative===
<syntaxhighlight lang=MATLAB"matlab">function F = fibonacci(n)
Fn = [1 0]; %Fn(1) is F_{n-2}, Fn(2) is F_{n-1}
Line 7,596 ⟶ 9,056:
The MATLAB help file suggests an interesting method of generating the Fibonacci numbers. Apparently the determinate of the Dramadah Matrix of type 3 (MATLAB designation) and size n-by-n is the nth Fibonacci number. This method is implimented below.
 
<syntaxhighlight lang=MATLAB"matlab">function number = fibonacci2(n)
if n == 1
Line 7,611 ⟶ 9,071:
 
===Tartaglia/Pascal Triangle Method===
<syntaxhighlight lang=Matlab"matlab">
function number = fibonacci(n)
%construct the Tartaglia/Pascal Triangle
Line 7,627 ⟶ 9,087:
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">/* fib(n) is built-in; here is an implementation */
fib2(n) := (matrix([0, 1], [1, 1])^^n)[1, 2]$
 
Line 7,638 ⟶ 9,098:
=={{header|MAXScript}}==
===Iterative===
<syntaxhighlight lang="maxscript">fn fibIter n =
(
if n < 2 then
Line 7,658 ⟶ 9,118:
)</syntaxhighlight>
===Recursive===
<syntaxhighlight lang="maxscript">fn fibRec n =
(
if n < 2 then
Line 7,676 ⟶ 9,136:
 
===fib.m===
<syntaxhighlight lang="mercury">
% The following code is derived from the Mercury Tutorial by Ralph Becket.
% http://www.mercury.csse.unimelb.edu.au/information/papers/book.pdf
Line 7,712 ⟶ 9,172:
The much faster iterative algorithm can be written as:
 
<syntaxhighlight lang="mercury">
:- pred fib_acc(int::in, int::in, int::in, int::in, int::out) is det.
 
Line 7,730 ⟶ 9,190:
</syntaxhighlight>
 
This predicate can be called as <syntaxhighlight lang="mercury">fib_acc(1, 40, 1, 1, Result)</syntaxhighlight>
It has several inputs which form the loop, the first is the current number, the second is a limit, ie when to stop counting. And the next two are accumulators for the last and next-to-last results.
 
Line 7,737 ⟶ 9,197:
But what if you want the speed of the fib_acc with the recursive (more declarative) definition of fib? Then use memoization, because Mercury is a pure language fib(N, F) will always give the same F for the same N, guaranteed. Therefore memoization asks the compiler to use a table to remember the value for F for any N, and it's a one line change:
 
<syntaxhighlight lang="mercury">
:- pragma memo(fib/2).
:- pred fib(int::in, int::out) is det.
Line 7,751 ⟶ 9,211:
 
=={{header|Metafont}}==
<syntaxhighlight lang="metafont">vardef fibo(expr n) =
if n=0: 0
elseif n=1: 1
Line 7,762 ⟶ 9,222:
end</syntaxhighlight>
 
=={{header|Microsoft Small Basic}}==
===Iterative===
<syntaxhighlight lang=smallbasic>' Fibonacci sequence - 31/07/2018
n = 139
f1 = 0
f2 = 1
TextWindow.WriteLine("fibo(0)="+f1)
TextWindow.WriteLine("fibo(1)="+f2)
For i = 2 To n
f3 = f1 + f2
TextWindow.WriteLine("fibo("+i+")="+f3)
f1 = f2
f2 = f3
EndFor</syntaxhighlight>
{{out}}
<pre>
fibo(139)=50095301248058391139327916261
</pre>
===Binet's Formula===
<syntaxhighlight lang=smallbasic>' Fibonacci sequence - Binet's Formula - 31/07/2018
n = 69
sq5=Math.SquareRoot(5)
phi1=(1+sq5)/2
phi2=(1-sq5)/2
phi1n=phi1
phi2n=phi2
For i = 2 To n
phi1n=phi1n*phi1
phi2n=phi2n*phi2
TextWindow.Write(Math.Floor((phi1n-phi2n)/sq5)+" ")
EndFor</syntaxhighlight>
{{out}}
<pre>
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994
</pre>
 
=={{header|min}}==
{{works with|min|0.1937.30}}
<syntaxhighlight lang="min">(
(2 <)
((0pred (1 0 (dup rollupover + swap)) dip pred times nippop)
unless
) :^fib</syntaxhighlight>
 
=={{header|MiniScript}}==
An efficient solution (for n >= 0):
<syntaxhighlight lang=MiniScript"miniscript">fibonacci = function(n)
if n < 2 then return n
n1 = 0
Line 7,823 ⟶ 9,248:
 
And for comparison, a recursive solution (also for n >= 0):
<syntaxhighlight lang=MiniScript"miniscript">rfib = function(n)
if n < 1 then return 0
if n == 1 then return 1
Line 7,831 ⟶ 9,256:
print rfib(6)</syntaxhighlight>
=={{header|MiniZinc}}==
<syntaxhighlight lang=MiniZinc"minizinc">function var int: fibonacci(int: n) =
let {
array[0..n] of var int: fibonacci;
Line 7,850 ⟶ 9,275:
 
This is the iterative approach to the Fibonacci sequence.
<syntaxhighlight lang=MIPS"mips">
.text
main: li $v0, 5 # read integer from input. The read integer will be stroed in $v0
Line 7,897 ⟶ 9,322:
 
=={{header|Mirah}}==
<syntaxhighlight lang="mirah">def fibonacci(n:int)
return n if n < 2
fibPrev = 1
Line 7,919 ⟶ 9,344:
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">П0 1 lg Вx <-> + L0 03 С/П БП
03</syntaxhighlight>
 
Line 7,928 ⟶ 9,353:
====Tail Recursion====
This version is tail recursive.
<syntaxhighlight lang="sml">fun fib n =
let
fun fib' (0,a,b) = a
Line 7,937 ⟶ 9,362:
 
====Recursion====
<syntaxhighlight lang="sml">fun fib n = if n < 2 then n else fib (n - 1) + fib (n - 2)</syntaxhighlight>
 
==={{header|MLite}}===
====Recursion====
Tail recursive.
<syntaxhighlight lang="ocaml">fun fib
(0, x1, x2) = x2
| (n, x1, x2) = fib (n-1, x2, x1+x2)
Line 7,948 ⟶ 9,373:
 
=={{header|ML/I}}==
<syntaxhighlight lang=ML"ml/Ii">MCSKIP "WITH" NL
"" Fibonacci - recursive
MCSKIP MT,<>
Line 7,965 ⟶ 9,390:
 
=={{header|Modula-2}}==
<syntaxhighlight lang="modula2">MODULE Fibonacci;
FROM FormatString IMPORT FormatString;
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
Line 8,005 ⟶ 9,430:
=={{header|Modula-3}}==
===Recursive===
<syntaxhighlight lang="modula3">PROCEDURE Fib(n: INTEGER): INTEGER =
BEGIN
IF n < 2 THEN
Line 8,016 ⟶ 9,441:
=== Iterative (with negatives) ===
 
<syntaxhighlight lang="modula3">PROCEDURE IterFib(n: INTEGER): INTEGER =
 
VAR
Line 8,055 ⟶ 9,480:
=={{header|Monicelli}}==
Recursive version. It includes a main that reads a number N from standard input and prints the Nth Fibonacci number.
<syntaxhighlight lang="monicelli">
# Main
Lei ha clacsonato
Line 8,072 ⟶ 9,497:
=={{header|MontiLang}}==
Reads number from standard input and prints to that number in the fibonacci sequence
<syntaxhighlight lang=MontiLang"montilang">0 VAR a .
1 VAR b .
INPUT TOINT
Line 8,084 ⟶ 9,509:
Forth-style solution
 
<syntaxhighlight lang=MontiLang"montilang">def over
swap dup rot swap
enddef
Line 8,099 ⟶ 9,524:
Simpler
 
<syntaxhighlight lang=MontiLang"montilang">|Enter a number to obtain Fibonacci sequence: | input nip 1 - var count .
0 1
FOR count
Line 8,110 ⟶ 9,535:
=={{header|MUMPS}}==
===Iterative===
<syntaxhighlight lang=MUMPS"mumps">FIBOITER(N)
;Iterative version to get the Nth Fibonacci number
;N must be a positive integer
Line 8,129 ⟶ 9,554:
=={{header|Nanoquery}}==
===Iterative===
<syntaxhighlight lang="nanoquery">def fibIter(n)
if (n < 2)
return n
Line 8,147 ⟶ 9,572:
=={{header|Nemerle}}==
===Recursive===
<syntaxhighlight lang=Nemerle"nemerle">using System;
using System.Console;
 
Line 8,166 ⟶ 9,591:
}</syntaxhighlight>
===Tail Recursive===
<syntaxhighlight lang=Nemerle"nemerle">Fibonacci(x : long, current : long, next : long) : long
{
match(x)
Line 8,182 ⟶ 9,607:
=={{header|NESL}}==
===Recursive===
<syntaxhighlight lang="nesl">function fib(n) = if n < 2 then n else fib(n - 2) + fib(n - 1);</syntaxhighlight>
 
=={{header|NetRexx}}==
{{trans|REXX}}
<syntaxhighlight lang=NetRexx"netrexx">/* NetRexx */
 
options replace format comments java crossref savelog symbols
Line 8,227 ⟶ 9,652:
=={{header|NewLISP}}==
===Iterative===
<syntaxhighlight lang=newLISP"newlisp">(define (fibonacci n)
(let (L '(0 1))
(dotimes (i n)
Line 8,235 ⟶ 9,660:
 
===Recursive===
<syntaxhighlight lang=newLISP"newlisp">(define (fibonacci n)
(if (< n 2) 1
(+ (fibonacci (- n 1))
Line 8,242 ⟶ 9,667:
 
===Matrix multiplication===
<syntaxhighlight lang=newLISP"newlisp">(define (fibonacci n)
(letn (f '((0 1) (1 1)) fib f)
(dotimes (i n)
Line 8,251 ⟶ 9,676:
 
===With a stack ===
<syntaxhighlight lang=newLISP"newlisp">
;;; Global variable (bigints); can be isolated in a namespace if need be
(setq stack '(0L 1L))
Line 8,272 ⟶ 9,697:
===Iterative===
{{trans|Python}}
<syntaxhighlight lang=NGS"ngs">F fib(n:Int) {
n < 2 returns n
local a = 1, b = 1
Line 8,291 ⟶ 9,716:
single iteration with n=1,000,000 takes it about 15s.
 
<syntaxhighlight lang="nial">fibi is op n {
if n<2 then
n
Line 8,306 ⟶ 9,731:
Iterative using fold. Slightly faster, <1.6s:
 
<syntaxhighlight lang="nial">fibf is op n {1 pick ((n- 1) fold [1 pick, +] 0 1)};</syntaxhighlight>
 
Tacit verion of above. Slightly faster still, <1.4s:
 
<syntaxhighlight lang="nial">fibf2 is 1 pick fold [1 pick, +] reverse (0 1 hitch) (-1+);</syntaxhighlight>
 
===Recursive===
Line 8,316 ⟶ 9,741:
(Similar to time for recursive python version with n=37.)
 
<syntaxhighlight lang="nial">fibr is op n {fork [2>, +, + [fibr (-1 +), fibr (-2 +)]] n};</syntaxhighlight>
 
...or tacit version. More than twice as fast (?) but still slow:
 
<syntaxhighlight lang="nial">fibr2 is fork [2>, +, + [fibr2 (-1 +), fibr2 (-2 +)]];</syntaxhighlight>
 
===Matrix===
Line 8,327 ⟶ 9,752:
Note that n>92 produces negative result.
 
<syntaxhighlight lang="nial">fibm is op n {floor (0 1 pick (reduce ip (n reshape [2 2 reshape 1 1 1 0])))};</syntaxhighlight>
 
Could it look a little more like J?
(Maybe 5% slower than above.)
 
<syntaxhighlight lang="nial">$ is reshape;
~ is tr f op a b {b f a}; % Goes before verb, rather than after like in J;
_ is floor; % Not really J, but J-ish? (Cannot redefine "<.".);
Line 8,341 ⟶ 9,766:
than the fastest matrix version above - similar speed to iterative:
 
<syntaxhighlight lang="nial">fibm3 is op n {a:=2 2$1 1 1 0; _(0 1 pick ((n- 1) fold (a ip) a))};</syntaxhighlight>
 
=={{header|Nim}}==
===Analytic===
<syntaxhighlight lang="nim">proc Fibonacci(n: int): int64 =
var fn = float64(n)
var p: float64 = (1.0 + sqrt(5.0)) / 2.0
Line 8,352 ⟶ 9,777:
 
===Iterative===
<syntaxhighlight lang="nim">proc Fibonacci(n: int): int =
var
first = 0
Line 8,364 ⟶ 9,789:
 
===Recursive===
<syntaxhighlight lang="nim">proc Fibonacci(n: int): int64 =
if n <= 2:
result = 1
Line 8,371 ⟶ 9,796:
 
===Tail-recursive===
<syntaxhighlight lang="nim">proc Fibonacci(n: int, current: int64, next: int64): int64 =
if n == 0:
result = current
Line 8,380 ⟶ 9,805:
 
===Continuations===
<syntaxhighlight lang="nim">iterator fib: int {.closure.} =
var a = 0
var b = 1
Line 8,392 ⟶ 9,817:
echo f()</syntaxhighlight>
=={{header|Nix}}==
<syntaxhighlight lang="nix">fibonacci = n:
if n <= 1 then n else (fibonacci (n - 1) + fibonacci (n - 2));</syntaxhighlight>
 
=={{header|Oberon-2}}==
{{Works with|oo2c Version 2}}
<syntaxhighlight lang="oberon2">
MODULE Fibonacci;
IMPORT
Line 8,473 ⟶ 9,898:
=={{header|Objeck}}==
===Recursive===
<syntaxhighlight lang="objeck">bundle Default {
class Fib {
function : Main(args : String[]), Nil {
Line 8,493 ⟶ 9,918:
=={{header|Objective-C}}==
===Recursive===
<syntaxhighlight lang="objc">-(long)fibonacci:(int)position
{
long result = 0;
Line 8,504 ⟶ 9,929:
}</syntaxhighlight>
===Iterative===
<syntaxhighlight lang="objc">+(long)fibonacci:(int)index {
long beforeLast = 0, last = 1;
while (index > 0) {
Line 8,515 ⟶ 9,940:
 
=={{header|OCaml}}==
===Tail-Recursive (fast)===
<syntaxhighlight lang="ocaml">let fib n =
let rec aux i a b =
if i = 0 then a else aux (pred i) b (a + b)
in
aux n 0 1</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang="ocaml">let fib_iter n =
if n < 2 then
n
Line 8,529 ⟶ 9,961:
 
===Recursive===
<syntaxhighlight lang="ocaml">let rec fib_rec n =
if n < 2 then
n
else
fib_rec (n - 1) + fib_rec (n - 2)
Line 8,545 ⟶ 9,977:
Using OCaml's [http://caml.inria.fr/pub/docs/manual-ocaml/libref/Num.html Num] module.
 
<syntaxhighlight lang="ocaml">open Num
 
let fib =
Line 8,582 ⟶ 10,014:
=== O(log(n)) with arbitrary precision ===
This performs log2(N) matrix multiplys. Each multiplication is not constant-time but increases sub-linearly, about O(log(N)).
<syntaxhighlight lang="ocaml">open Num
 
let mul (a,b,c) (d,e,f) = let bxe = b*/e in
Line 8,599 ⟶ 10,031:
Printf.printf "fib %d = %s\n" 300 (fib 300)</syntaxhighlight>
Output:<pre>fib 300 = 222232244629420445529739893461909967206666939096499764990979600</pre>
 
=== Matrix Exponentiation ===
<syntaxhighlight lang="ocaml">
open List
;;
let rec bin n =
if n < 2 then [n mod 2 = 1]
else bin (n/2) @ [n mod 2 = 1]
;;
let cut = function
| [] -> []
| _ :: x -> x
;;
let multiply a b =
let ((p, q), (r, s)) = a in
let ((t, u), (v, w)) = b in
((p*t+q*v, p*u+q*w), (r*t+s*v, r*u+s*w))
;;
let fib n =
let rec f p q r =
if length r = 1 then
if nth r 0 then (multiply p q, q)
else (p, q)
else
let (pp, qq) = f p q (cut r) in
let qqq = multiply qq qq in
if nth r 0 then (multiply pp qqq, qqq)
else (pp, qqq) in
f ((1L, 0L), (0L, 1L)) ((1L, 1L), (1L, 0L)) (bin n) |> fst |> fst |> snd
;;
</syntaxhighlight>
 
=={{header|Octave}}==
===Recursive===
<syntaxhighlight lang="octave">% recursive
function fibo = recfibo(n)
if ( n < 2 )
Line 8,612 ⟶ 10,075:
 
'''Testing'''
<syntaxhighlight lang="octave">% testing
for i = 0 : 20
printf("%d %d\n", i, recfibo(i));
Line 8,618 ⟶ 10,081:
 
===Iterative===
<syntaxhighlight lang="octave">% iterative
function fibo = iterfibo(n)
if ( n < 2 )
Line 8,636 ⟶ 10,099:
 
'''Testing'''
<syntaxhighlight lang="octave">% testing
for i = 0 : 20
printf("%d %d\n", i, iterfibo(i));
Line 8,642 ⟶ 10,105:
 
===Analytic===
<syntaxhighlight lang="octave">function retval = fibanalytic(n)
retval = round(((5 .^ 0.5 + 1) / 2) .^ n / 5 .^ 0.5);
endfunction</syntaxhighlight>
 
===Tail Recursive===
<syntaxhighlight lang="octave">function retval = fibtailrecursive(n, prevfib = 0, fib = 1)
if (n == 0)
retval = prevfib;
Line 8,654 ⟶ 10,117:
endif
endfunction</syntaxhighlight>
 
=={{header|Odin}}==
Fibinacci Sequence - Iterative Solution<br>
Odin Build: dev-2023-07-nightly:3072479c
<syntaxhighlight lang="odin">
package fib
import "core:fmt"
 
main :: proc() {
fmt.println("\nFibonacci Seq - starting n and n+1 from 0 and 1:")
fmt.println("------------------------------------------------")
for j: u128 = 0; j <= 20; j += 1 {
fmt.println("n:", j, "\tFib:", fibi(j))
}
}
 
fibi :: proc(n: u128) -> u128 {
if n < 2 {
return n
}
a, b: u128 = 0, 1
for _ in 2..=n {
a += b
a, b = b, a
}
return b
}
</syntaxhighlight>
{{out}}
<pre>
First 20 Fibonacci Numbers
Starting n and n+1 from 0 and 1
-------------------------------
n: 0 Fib: 0
n: 1 Fib: 1
n: 2 Fib: 1
n: 3 Fib: 2
n: 4 Fib: 3
n: 5 Fib: 5
n: 6 Fib: 8
n: 7 Fib: 13
n: 8 Fib: 21
n: 9 Fib: 34
n: 10 Fib: 55
n: 11 Fib: 89
n: 12 Fib: 144
n: 13 Fib: 233
n: 14 Fib: 377
n: 15 Fib: 610
n: 16 Fib: 987
n: 17 Fib: 1597
n: 18 Fib: 2584
n: 19 Fib: 4181
n: 20 Fib: 6765
-------------------------------
</pre>
 
=={{header|Oforth}}==
<syntaxhighlight lang=Oforth"oforth">: fib 0 1 rot #[ tuck + ] times drop ;</syntaxhighlight>
 
=={{header|Ol}}==
Same as [https://rosettacode.org/wiki/Fibonacci_sequence#Scheme Scheme] example(s).
 
=={{header|Onyx (wasm)}}==
<syntaxhighlight lang="C">
use core.iter
use core { printf }
 
// Procedural Simple For-Loop Style
fib_for_loop :: (n: i32) -> i32 {
a: i32 = 0;
b: i32 = 1;
for 0 .. n {
tmp := a;
a = b;
b = tmp + b;
}
return a;
}
 
FibState :: struct { a, b: u64 }
 
// Functional Folding Style
fib_by_fold :: (n: i32) => {
end_state :=
iter.counter()
|> iter.take(n)
|> iter.fold(
FibState.{ a = 0, b = 1 },
(_, state) => FibState.{
a = state.b,
b = state.a + state.b
}
);
return end_state.a;
}
 
// Custom Iterator Style
fib_iterator :: (n: i32) =>
iter.generator(
&.{ a = cast(u64) 0, b = cast(u64) 1, counter = n },
(state: & $Ctx) -> (u64, bool) {
if state.counter <= 0 {
return 0, false;
}
tmp := state.a;
state.a = state.b;
state.b = state.b + tmp;
state.counter -= 1;
return tmp, true;
}
);
 
main :: () {
printf("\nBy For Loop:\n");
for i in 0 .. 21 {
printf("{} ", fib_for_loop(i));
}
 
printf("\n\nBy Iterator:\n");
for i in 0 .. 21 {
printf("{} ", fib_by_fold(i));
}
 
printf("\n\nBy Fold:\n");
for value, index in fib_iterator(21) {
printf("{} ", value);
}
}
</syntaxhighlight>
{{out}}
<pre>
For-Loop:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
 
Functional Fold:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
 
Custom Iterator:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
 
=={{header|OPL}}==
<syntaxhighlight lang="opl">FIBON:
REM Fibonacci sequence is generated to the Organiser II floating point variable limit.
REM CLEAR/ON key quits.
Line 8,678 ⟶ 10,276:
=={{header|Order}}==
===Recursive===
<syntaxhighlight lang="c">#include <order/interpreter.h>
 
#define ORDER_PP_DEF_8fib_rec \
Line 8,690 ⟶ 10,288:
 
Tail recursive version (example supplied with language):
<syntaxhighlight lang="c">#include <order/interpreter.h>
#define ORDER_PP_DEF_8fib \
Line 8,705 ⟶ 10,303:
 
===Memoization===
<syntaxhighlight lang="c">#include <order/interpreter.h>
 
#define ORDER_PP_DEF_8fib_memo \
Line 8,735 ⟶ 10,333:
===Iterative===
Using mutable references (cells).
<syntaxhighlight lang="oz">fun{FibI N}
Temp = {NewCell 0}
A = {NewCell 0}
Line 8,750 ⟶ 10,348:
===Recursive===
Inefficient (blows up the stack).
<syntaxhighlight lang="oz">fun{FibR N}
if N < 2 then N
else {FibR N-1} + {FibR N-2}
Line 8,758 ⟶ 10,356:
===Tail-recursive===
Using accumulators.
<syntaxhighlight lang="oz">fun{Fib N}
fun{Loop N A B}
if N == 0 then
Line 8,771 ⟶ 10,369:
 
===Lazy-recursive===
<syntaxhighlight lang="oz">declare
fun lazy {FiboSeq}
{LazyMap
Line 8,794 ⟶ 10,392:
=={{header|PARI/GP}}==
===Built-in===
<syntaxhighlight lang="parigp">fibonoccifibonacci(n)</syntaxhighlight>
 
===Matrix===
<syntaxhighlight lang="parigp">fib(n)=([1,1;1,0]^n)[1,2]</syntaxhighlight>
 
===Analytic===
This uses the Binet form.
<syntaxhighlight lang="parigp">fib(n)=my(phi=(1+sqrt(5))/2);round((phi^n-phi^-n)/sqrt(5))</syntaxhighlight>
The second term can be dropped since the error is always small enough to be subsumed by the rounding.
<syntaxhighlight lang="parigp">fib(n)=round(((1+sqrt(5))/2)^n/sqrt(5))</syntaxhighlight>
 
===Algebraic===
Line 8,810 ⟶ 10,408:
and hence <code>real(quadgen(5)^n)</code> would give the (n-1)-th Fibonacci number.
 
<syntaxhighlight lang="parigp">fib(n)=imag(quadgen(5)^n)</syntaxhighlight>
 
A more direct translation (note that <math>\sqrt5=2\phi-1</math>) would be
<syntaxhighlight lang="parigp">fib(n)=my(phi=quadgen(5));(phi^n-(-1/phi)^n)/(2*phi-1)</syntaxhighlight>
 
===Combinatorial===
This uses the generating function. It can be trivially adapted to give the first n Fibonacci numbers.
<syntaxhighlight lang="parigp">fib(n)=polcoeff(x/(1-x-x^2)+O(x^(n+1)),n)</syntaxhighlight>
 
===Binary powering===
This is an efficient method (similar to the one used internally by <code>fibonacci()</code>), although running it without compilation won't give competitive speed.
<syntaxhighlight lang=parigp>fib(n)={
<syntaxhighlight lang="parigp">fib(n)={
if(n<=0,
if(n,(-1)^(n+1)*fib(n),0)
Line 8,840 ⟶ 10,439:
 
===Recursive===
<syntaxhighlight lang="parigp">fib(n)={
if(n<2,
n
Line 8,851 ⟶ 10,450:
{{works with|PARI/GP|2.8.0+}}
This uses <code>self()</code> which gives a self-reference.
<syntaxhighlight lang="parigp">fib(n)={
if(n<2,
n
Line 8,861 ⟶ 10,460:
 
It can be used without being named:
<syntaxhighlight lang="parigp">apply(n->if(n<2,n,my(s=self());s(n-2)+s(n-1)), [1..10])</syntaxhighlight>
gives
{{out}}
Line 8,867 ⟶ 10,466:
 
===Memoization===
<syntaxhighlight lang="parigp">F=[];
fib(n)={
if(n>#F,
Line 8,882 ⟶ 10,481:
 
===Iterative===
<syntaxhighlight lang="parigp">fib(n)={
if(n<0,return((-1)^(n+1)*fib(n)));
my(a=0,b=1,t);
Line 8,893 ⟶ 10,492:
a
};</syntaxhighlight>
 
===Trigonometric===
This solution uses the complex hyperbolic sine.
<syntaxhighlight lang="parigp">fib(n)=real(2/sqrt(5)/I^n*sinh(n*log(I*(1+sqrt(5))/2)))\/1;</syntaxhighlight>
 
===Chebyshev===
This solution uses Chebyshev polynomials of the second kind (Chyebyshev U-polynomials).
<syntaxhighlight lang="parigp">fib(n)=n--;polchebyshev(n,2,I/2)*I^n;</syntaxhighlight>
or
<syntaxhighlight lang="parigp">fib(n)=abs(polchebyshev(n-1,2,I/2));</syntaxhighlight>
 
===Anti-Hadamard matrix===
Line 8,904 ⟶ 10,507:
R. L. Graham and N. J. A. Sloane, [http://www.math.ucsd.edu/~ronspubs/84_03_anti_hadamard.pdf Anti-Hadamard matrices], Linear Algebra Appl. 62 (1984), 113–137.</ref> matches this upper bound, and hence can be used as an inefficient method for computing Fibonacci numbers of positive index. These matrices are the same as Matlab's type-3 "Dramadah" matrices, following a naming suggestion of C. L. Mallows according to Graham & Sloane.
 
<syntaxhighlight lang="parigp">matantihadamard(n)={
matrix(n,n,i,j,
my(t=j-i+1);
Line 8,915 ⟶ 10,518:
===Testing adjacent bits===
The Fibonacci numbers can be characterized (for n > 0) as the number of n-bit strings starting and ending with 1 without adjacent 0s. This inefficient, exponential-time algorithm demonstrates:
<syntaxhighlight lang="parigp">fib(n)=
{
my(g=2^(n+1)-1);
Line 8,925 ⟶ 10,528:
===One-by-one===
This code is purely for amusement and requires n > 1. It tests numbers in order to see if they are Fibonacci numbers, and waits until it has seen ''n'' of them.
<syntaxhighlight lang="parigp">fib(n)=my(k=0);while(n--,k++;while(!issquare(5*k^2+4)&&!issquare(5*k^2-4),k++));k</syntaxhighlight>
 
=={{header|ParaCL}}==
<syntaxhighlight lang="parasl">
fibbonachi = func(x) : fibb
{
res = 1;
if (x > 1)
res = fibb(x - 1) + fibb(x - 2);
res;
}
</syntaxhighlight>
 
=={{header|Pascal}}==
===Analytic===
<syntaxhighlight lang="pascal">function fib(n: integer):longInt;
const
Sqrt5 = sqrt(5.0);
Line 8,948 ⟶ 10,562:
 
===Recursive===
<syntaxhighlight lang="pascal">function fib(n: integer): integer;
begin
if (n = 0) or (n = 1)
Line 8,958 ⟶ 10,572:
 
===Iterative===
<syntaxhighlight lang="pascal">function fib(n: integer): integer;
var
f0, f1, tmpf0, k: integer;
Line 8,982 ⟶ 10,596:
 
===Analytic2===
<syntaxhighlight lang="pascal">function FiboMax(n: integer):Extended; //maXbox
begin
result:= (pow((1+SQRT5)/2,n)-pow((1-SQRT5)/2,n))/SQRT5
Line 8,988 ⟶ 10,602:
 
 
<syntaxhighlight lang="pascal">function Fibo_BigInt(n: integer): string; //maXbox
var tbig1, tbig2, tbig3: TInteger;
begin
Line 9,013 ⟶ 10,627:
>>>43516638122555047989641805373140394725407202037260729735885664398655775748034950972577909265605502785297675867877570
 
===Doubling (iterative)===
The Clojure solution gives a recursive version of the Fibonacci doubling algorithm. The code below is an iterative version, written in Free Pascal. The unsigned 64-bit integer type can hold Fibonacci numbers up to F[93].
<syntaxhighlight lang="pascal">
program Fibonacci_console;
 
{$mode objfpc}{$H+}
 
uses SysUtils;
 
function Fibonacci( n : word) : uint64;
{
Starts with the pair F[0],F[1]. At each iteration, uses the doubling formulae
to pass from F[k],F[k+1] to F[2k],F[2k+1]. If the current bit of n (starting
from the high end) is 1, there is a further step to F[2k+1],F[2k+2].
}
var
marker, half_n : word;
f, g : uint64; // pair of consecutive Fibonacci numbers
t, u : uint64; // -----"-----
begin
// The values of F[0], F[1], F[2] are assumed to be known
case n of
0 : result := 0;
1, 2 : result := 1;
else begin
half_n := n shr 1;
marker := 1;
while marker <= half_n do marker := marker shl 1;
 
// First time: current bit is 1 by construction,
// so go straight from F[0],F[1] to F[1],F[2].
f := 1; // = F[1]
g := 1; // = F[2]
marker := marker shr 1;
 
while marker > 1 do begin
t := f*(2*g - f);
u := f*f + g*g;
if (n and marker = 0) then begin
f := t;
g := u;
end
else begin
f := u;
g := t + u;
end;
marker := marker shr 1;
end;
 
// Last time: we need only one of the pair.
if (n and marker = 0) then
result := f*(2*g - f)
else
result := f*f + g*g;
end; // end else (i.e. n > 2)
end; // end case
end;
 
// Main program
var
n : word;
begin
for n := 0 to 93 do
WriteLn( SysUtils.Format( 'F[%2u] = %20u', [n, Fibonacci(n)]));
end.
</syntaxhighlight>
{{out}}
<pre>
F[ 0] = 0
F[ 1] = 1
F[ 2] = 1
F[ 3] = 2
F[ 4] = 3
F[ 5] = 5
F[ 6] = 8
F[ 7] = 13
[...]
F[90] = 2880067194370816120
F[91] = 4660046610375530309
F[92] = 7540113804746346429
F[93] = 12200160415121876738
</pre>
 
=={{header|PascalABC.NET}}==
Uses functionality from [[Fibonacci n-step number sequences#PascalABC.NET]]
<syntaxhighlight lang="pascal">
// Fibonacci sequence. Nigel Galloway: August 30th., 2022
begin
unfold(nFib,0bi,1bi).ElementAt(1000).Println;
end.
</syntaxhighlight>
<pre>
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
</pre>
=={{header|Perl}}==
===Iterative===
<syntaxhighlight lang="perl">sub fib_iter {
my $n = shift;
use bigint try => "GMP,Pari";
Line 9,024 ⟶ 10,732:
 
===Recursive===
<syntaxhighlight lang="perl">sub fibRec {
my $n = shift;
$n < 2 ? $n : fibRec($n - 1) + fibRec($n - 2);
Line 9,031 ⟶ 10,739:
===Modules===
Quite a few modules have ways to do this. Performance is not typically an issue with any of these until 100k or so. With GMP available, the first three are ''much'' faster at large values.
<syntaxhighlight lang="perl"># Uses GMP method so very fast
use Math::AnyNum qw/fibonacci/;
say fibonacci(10000);
Line 9,055 ⟶ 10,763:
use Math::Fibonacci qw/term/;
say term(10000);</syntaxhighlight>
 
===Array accumulation===
<p>This solution accumulates all Fibonacci numbers up to <i>n</i> into an array of <i>n</i>+1 elements (to account for the zeroth Fibonacci number). When the loop reaches <i>n</i>, the function returns the last element of the array, i.e. the <i>n</i>-th Fibonacci number. This function only works for positive integers, but it can be easily extended into negatives.</p>
<p>Note that, without the use of big integer libraries, pure Perl switches to floats in scientific notation above <i>n</i>=93 and treats any number as infinite above <i>n</i>=1476 (see output). This behaviour could vary across Perl implementations.</p>
<syntaxhighlight lang = "Perl>
sub fibonacci {
my $n = shift;
return 0 if $n < 1;
return 1 if $n == 1;
my @numbers = (0, 1);
 
push @numbers, $numbers[-1] + $numbers[-2] foreach 2 .. $n;
return $numbers[-1];
}
 
print "Fibonacci($_) -> ", (fibonacci $_), "\n"
foreach (0 .. 20, 50, 93, 94, 100, 200, 1000, 1476, 1477);
</syntaxhighlight>
 
{{out}}
<pre>
Fibonacci(0) -> 0
Fibonacci(1) -> 1
Fibonacci(2) -> 1
Fibonacci(3) -> 2
Fibonacci(4) -> 3
Fibonacci(5) -> 5
Fibonacci(6) -> 8
Fibonacci(7) -> 13
Fibonacci(8) -> 21
Fibonacci(9) -> 34
Fibonacci(10) -> 55
Fibonacci(11) -> 89
Fibonacci(12) -> 144
Fibonacci(13) -> 233
Fibonacci(14) -> 377
Fibonacci(15) -> 610
Fibonacci(16) -> 987
Fibonacci(17) -> 1597
Fibonacci(18) -> 2584
Fibonacci(19) -> 4181
Fibonacci(20) -> 6765
Fibonacci(50) -> 12586269025
Fibonacci(93) -> 12200160415121876738
Fibonacci(94) -> 1.97402742198682e+19
Fibonacci(100) -> 3.54224848179262e+20
Fibonacci(200) -> 2.8057117299251e+41
Fibonacci(1000) -> 4.34665576869374e+208
Fibonacci(1476) -> 1.3069892237634e+308
Fibonacci(1477) -> Inf
</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">fibonacci</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- iterative, works for -ve numbers</span>
<span style="color: #004080;">atom</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span>
Line 9,081 ⟶ 10,843:
Using native integers/atoms, errors creep in above 78, so the same program converted to use mpfr:
{{libheader|Phix/mpfr}}
<!--<syntaxhighlight lang=Phix"phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\fibonacci.exw</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 9,137 ⟶ 10,899:
 
=={{header|Phixmonti}}==
<syntaxhighlight lang=Phixmonti"phixmonti">def Fibonacci
dup 0 < if
"Invalid argument: " print
Line 9,154 ⟶ 10,916:
=={{header|PHP}}==
===Iterative===
<syntaxhighlight lang="php">function fibIter($n) {
if ($n < 2) {
return $n;
Line 9,166 ⟶ 10,928:
}</syntaxhighlight>
===Recursive===
<syntaxhighlight lang="php">function fibRec($n) {
return $n < 2 ? $n : fibRec($n-1) + fibRec($n-2);
}</syntaxhighlight>
Line 9,173 ⟶ 10,935:
===Function===
tabling for speed.
<syntaxhighlight lang=Picat"picat">go =>
println([fib_fun(I) : I in 1..10]),
F1=fib_fun(2**10),
Line 9,189 ⟶ 10,951:
 
===Array===
<syntaxhighlight lang=Picat"picat">fib_array(0,[0]).
fib_array(1,[0,1]).
fib_array(N,A) :-
Line 9,201 ⟶ 10,963:
 
===Loop===
<syntaxhighlight lang=Picat"picat">fib_loop(N) = Curr =>
Curr = 0,
Prev = 1,
Line 9,213 ⟶ 10,975:
{{trans|Tcl}}
Works for n <= 70.
<syntaxhighlight lang=Picat"picat">fib_formula(N) = round((0.5 + 0.5*sqrt(5))**N / sqrt(5)).</syntaxhighlight>
 
==="Lazy lists"===
{{trans|Prolog}}
<syntaxhighlight lang=Picat"picat">go =>fib_lazy(X),
A = new_list(15),
append(A,_,X),
Line 9,232 ⟶ 10,994:
===Generators idiom===
{{trans|Prolog}}
<syntaxhighlight lang=Picat"picat">go =>
take(15, $fib_gen(0,1), $T-[], _G),
println(T).
Line 9,257 ⟶ 11,019:
 
 
<syntaxhighlight lang=Picat"picat">import cp.
 
go =>
Line 9,292 ⟶ 11,054:
=={{header|PicoLisp}}==
===Recursive===
<syntaxhighlight lang=PicoLisp"picolisp">(de fibo (N)
(if (>= 2 N)
1
Line 9,302 ⟶ 11,064:
===Recursive with Cache===
Using a recursive version doesn't need to be slow, as the following shows:
<syntaxhighlight lang=PicoLisp"picolisp">(de fibo (N)
(cache '(NIL) N # Use a cache to accelerate
(if (>= 2 N)
Line 9,310 ⟶ 11,072:
(bench (fibo 1000))</syntaxhighlight>
Output:
<syntaxhighlight lang=PicoLisp"picolisp">0.012 sec
-> 43466557686937456435688527675040625802564660517371780402481729089536555417949
05189040387984007925516929592259308032263477520968962323987332247116164299644090
Line 9,316 ⟶ 11,078:
 
===Iterative===
<syntaxhighlight lang=PicoLisp"picolisp">(de fib (N)
(let (A 0 B 1)
(do N
Line 9,322 ⟶ 11,084:
 
===Coroutines===
<syntaxhighlight lang=PicoLisp"picolisp">(co 'fibo
(let (A 0 B 1)
(yield 'ready)
Line 9,339 ⟶ 11,101:
 
===Iterative===
<syntaxhighlight lang="pike">int
fibIter(int n) {
int fibPrev, fib, i;
Line 9,356 ⟶ 11,118:
 
===Recursive===
<syntaxhighlight lang="pike">int
fibRec(int n) {
if (n < 2) {
Line 9,367 ⟶ 11,129:
Recursive:
{{works with|Parrot|tested with 2.4.0}}
<syntaxhighlight lang="pir">.sub fib
.param int n
.local int nt
Line 9,400 ⟶ 11,162:
Iterative (stack-based):
{{works with|Parrot|tested with 2.4.0}}
<syntaxhighlight lang="pir">.sub fib
.param int n
.local int counter
Line 9,450 ⟶ 11,212:
end
.end</syntaxhighlight>
 
=={{header|PL/0}}==
The program waits for ''n''. Then it displays ''n''<sup>th</sup> Fibonacci number.
<syntaxhighlight lang="pascal">
var n, a, b, i, tmp;
begin
? n;
a := 0; b := 1;
i := 2;
while i <= n do
begin
tmp := b; b := a + b; a := tmp;
i := i + 1
end;
! b
end.
</syntaxhighlight>
4 runs.
{{in}}
<pre>5</pre>
{{out}}
<pre> 5</pre>
{{in}}
<pre>9</pre>
{{out}}
<pre> 34</pre>
{{in}}
<pre>13</pre>
{{out}}
<pre> 233</pre>
{{in}}
<pre>20</pre>
{{out}}
<pre> 6765</pre>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pli">/* Form the n-th Fibonacci number, n > 1. 12 March 2022 */
Fib: procedure (n) returns (fixed binary (31));
declare (i, n, f1, f2, f3) fixed binary (31);
Line 9,468 ⟶ 11,264:
 
=={{header|PL/M}}==
<syntaxhighlight lang="plm">100H:
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
Line 9,511 ⟶ 11,307:
 
=== Recursive ===
<syntaxhighlight lang=SQL"sql">CREATE OR REPLACE FUNCTION fib(n INTEGER) RETURNS INTEGER AS $$
BEGIN
IF (n < 2) THEN
Line 9,521 ⟶ 11,317:
 
=== Calculated ===
<syntaxhighlight lang=SQL"sql">CREATE OR REPLACE FUNCTION fibFormula(n INTEGER) RETURNS INTEGER AS $$
BEGIN
RETURN round(pow((pow(5, .5) + 1) / 2, n) / pow(5, .5));
Line 9,528 ⟶ 11,324:
 
=== Linear ===
<syntaxhighlight lang=SQL"sql">CREATE OR REPLACE FUNCTION fibLinear(n INTEGER) RETURNS INTEGER AS $$
DECLARE
prevFib INTEGER := 0;
Line 9,547 ⟶ 11,343:
 
=== Tail recursive ===
<syntaxhighlight lang=SQL"sql">CREATE OR REPLACE FUNCTION fibTailRecursive(n INTEGER, prevFib INTEGER DEFAULT 0, fib INTEGER DEFAULT 1)
RETURNS INTEGER AS $$
BEGIN
Line 9,558 ⟶ 11,354:
 
=={{header|PL/SQL}}==
<syntaxhighlight lang="plsql">
create or replace function fnu_fibonacci(p_num integer) return integer is
f integer;
Line 9,582 ⟶ 11,378:
 
=={{header|Plain English}}==
<syntaxhighlight lang="plainenglish">To find a fibonacci number given a count:
Put 0 into a number.
Put 1 into another number.
Line 9,592 ⟶ 11,388:
 
=={{header|Pop11}}==
<syntaxhighlight lang="pop11">define fib(x);
lvars a , b;
1 -> a;
Line 9,605 ⟶ 11,401:
Enter the desired number for "n" and run through your favorite postscript previewer or send to your postscript printer:
 
<syntaxhighlight lang="postscript">%!PS
 
% We want the 'n'th fibonacci number
Line 9,630 ⟶ 11,426:
===Recursive===
Starts with int and upgrades on-the-fly to doubles.
<syntaxhighlight lang="potion">recursive = (n):
if (n <= 1): 1. else: recursive (n - 1) + recursive (n - 2)..
 
Line 9,642 ⟶ 11,438:
 
===Iterative===
<syntaxhighlight lang="potion">iterative = (n) :
curr = 0
prev = 1
Line 9,655 ⟶ 11,451:
 
===Matrix based===
<syntaxhighlight lang="potion">sqr = (x): x * x.
 
# Based on the fact that
Line 9,677 ⟶ 11,473:
 
===Handling negative values===
<syntaxhighlight lang="text">fibonacci = (n) :
myFavorite = matrix
if (n >= 0) :
Line 9,690 ⟶ 11,486:
.
.</syntaxhighlight>
 
=={{header|PowerBASIC}}==
{{trans|BASIC}}
 
There seems to be a limitation (dare I say, bug?) in PowerBASIC regarding how large numbers are stored. 10E17 and larger get rounded to the nearest 10. For F(n), where ABS(n) > 87, is affected like this:
actual: displayed:
F(88) 1100087778366101931 1100087778366101930
F(89) 1779979416004714189 1779979416004714190
F(90) 2880067194370816120 2880067194370816120
F(91) 4660046610375530309 4660046610375530310
F(92) 7540113804746346429 7540113804746346430
 
<syntaxhighlight lang=powerbasic>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</syntaxhighlight>
 
=={{header|PowerShell}}==
===Iterative===
<syntaxhighlight lang="powershell">
function FibonacciNumber ( $count )
{
Line 9,767 ⟶ 11,503:
An even shorter version that eschews function calls altogether:
 
<syntaxhighlight lang="powershell">
$count = 8
$answer = @(0,1)
Line 9,775 ⟶ 11,511:
 
===Recursive===
<syntaxhighlight lang="powershell">function fib($n) {
switch ($n) {
0 { return 0 }
Line 9,786 ⟶ 11,522:
=={{header|Processing}}==
{{trans|Java}}
<syntaxhighlight lang="processing">void setup() {
size(400, 400);
fill(255, 64);
Line 9,823 ⟶ 11,559:
{{works with|GNU Prolog}}
{{works with|YAP}}
<syntaxhighlight lang="prolog">
fib(1, 1) :- !.
fib(0, 0) :- !.
Line 9,833 ⟶ 11,569:
 
This naive implementation works, but is very slow for larger values of N. Here are some simple measurements (in SWI-Prolog):
<syntaxhighlight lang="prolog">?- time(fib(0,F)).
% 2 inferences, 0.000 CPU in 0.000 seconds (88% CPU, 161943 Lips)
F = 0.
Line 9,861 ⟶ 11,597:
 
The performance problem can be readily fixed by the addition of two lines of code (the first and last in this version):
<syntaxhighlight lang="prolog">%:- dynamic fib/2. % This is ISO, but GNU doesn't like it.
:- dynamic(fib/2). % Not ISO, but works in SWI, YAP and GNU unlike the ISO declaration.
fib(1, 1) :- !.
Line 9,873 ⟶ 11,609:
Let's take a look at the execution costs now:
 
<syntaxhighlight lang="prolog">?- time(fib(0,F)).
% 2 inferences, 0.000 CPU in 0.000 seconds (90% CPU, 160591 Lips)
F = 0.
Line 9,895 ⟶ 11,631:
In this case by asserting the new N,Value pairing as a rule in the database we're making the classic time/space tradeoff. Since the space costs are (roughly) linear by N and the time costs are exponential by N, the trade-off is desirable. You can see the poor man's memoizing easily:
 
<syntaxhighlight lang="prolog">?- listing(fib).
:- dynamic fib/2.
 
Line 9,951 ⟶ 11,687:
===Continuation passing style===
Works with <b>SWI-Prolog</b> and module lambda, written by <b>Ulrich Neumerkel</b> found there http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
<syntaxhighlight lang=Prolog"prolog">:- use_module(lambda).
fib(N, FN) :-
cont_fib(N, _, FN, \_^Y^_^U^(U = Y)).
Line 9,969 ⟶ 11,705:
Works with <b>SWI-Prolog</b> and others that support <code>freeze/2</code>.
 
<syntaxhighlight lang=Prolog"prolog">fib([0,1|X]) :-
ffib(0,1,X).
ffib(A,B,X) :-
Line 9,976 ⟶ 11,712:
The predicate <code>fib(Xs)</code> unifies <code>Xs</code> with an infinite list whose values are the Fibonacci sequence. The list can be used like this:
 
<syntaxhighlight lang=Prolog"prolog">?- fib(X), length(A,15), append(A,_,X), writeln(A).
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]</syntaxhighlight>
 
===Generators idiom===
 
<syntaxhighlight lang=Prolog"prolog">take( 0, Next, Z-Z, Next).
take( N, Next, [A|B]-Z, NZ):- N>0, !, next( Next, A, Next1),
N1 is N-1,
Line 9,995 ⟶ 11,731:
One of my favorites; loosely similar to the first example, but without the performance penalty, and needs nothing special to implement. Not even a dynamic database predicate. Attributed to M.E. for the moment, but simply because I didn't bother to search for the many people who probably did it like this long before I did. If someone knows who came up with it first, please let us know.
 
<syntaxhighlight lang=Prolog"prolog">% Fibonacci sequence generator
fib(C, [P,S], C, N) :- N is P + S.
fib(C, [P,S], Cv, V) :- succ(C, Cn), N is P + S, !, fib(Cn, [S,N], Cv, V).
Line 10,045 ⟶ 11,781:
 
=== Efficient implementation ===
<syntaxhighlight lang=Prolog"prolog">
% John Devou: 26-Nov-2021
% Efficient program to calculate n-th Fibonacci number.
Line 10,080 ⟶ 11,816:
=={{header|Pure}}==
===Tail Recursive===
<syntaxhighlight lang="pure">fib n = loop 0 1 n with
loop a b n = if n==0 then a else loop b (a+b) (n-1);
end;</syntaxhighlight>
 
=={{header|PureBasic}}==
 
===Macro based calculation===
<syntaxhighlight lang=PureBasic>Macro Fibonacci (n)
Int((Pow(((1+Sqr(5))/2),n)-Pow(((1-Sqr(5))/2),n))/Sqr(5))
EndMacro</syntaxhighlight>
===Recursive===
<syntaxhighlight lang=PureBasic>Procedure FibonacciReq(n)
If n<2
ProcedureReturn n
Else
ProcedureReturn FibonacciReq(n-1)+FibonacciReq(n-2)
EndIf
EndProcedure</syntaxhighlight>
 
===Recursive & optimized with a static hash table===
This will be much faster on larger n's, this as it uses a table to store known parts instead of recalculating them.
On my machine the speedup compares to above code is
Fib(n) Speedup
20 2
25 23
30 217
40 25847
46 1156741
<syntaxhighlight lang=PureBasic>Procedure Fibonacci(n)
Static NewMap Fib.i()
Protected FirstRecursion
If MapSize(Fib())= 0 ; Init the hash table the first run
Fib("0")=0: Fib("1")=1
FirstRecursion = #True
EndIf
If n >= 2
Protected.s s=Str(n)
If Not FindMapElement(Fib(),s) ; Calculate only needed parts
Fib(s)= Fibonacci(n-1)+Fibonacci(n-2)
EndIf
n = Fib(s)
EndIf
If FirstRecursion ; Free the memory when finalizing the first call
ClearMap(Fib())
EndIf
ProcedureReturn n
EndProcedure</syntaxhighlight>
 
'''Example'''
Fibonacci(0)= 0
Fibonacci(1)= 1
Fibonacci(2)= 1
Fibonacci(3)= 2
Fibonacci(4)= 3
Fibonacci(5)= 5
FibonacciReq(0)= 0
FibonacciReq(1)= 1
FibonacciReq(2)= 1
FibonacciReq(3)= 2
FibonacciReq(4)= 3
FibonacciReq(5)= 5
 
=={{header|Purity}}==
The following takes a natural number and generates an initial segment of the Fibonacci sequence of that length:
 
<syntaxhighlight lang=Purity"purity">
data Fib1 = FoldNat
<
Line 10,158 ⟶ 11,833:
This following calculates the Fibonacci sequence as an infinite stream of natural numbers:
 
<syntaxhighlight lang=Purity"purity">
type (Stream A?,,,Unfold) = gfix X. A? . X?
data Fib2 = Unfold ((outl, (uncurry Add, outl))) ((curry id) One One)
Line 10,165 ⟶ 11,840:
As a histomorphism:
 
<syntaxhighlight lang=Purity"purity">
import Histo
 
Line 10,182 ⟶ 11,857:
===Analytic===
Binet's formula:
<syntaxhighlight lang="python">from math import *
 
def analytic_fibonacci(n):
Line 10,198 ⟶ 11,873:
 
===Iterative===
<syntaxhighlight lang="python">def fibIter(n):
if n < 2:
return n
Line 10,208 ⟶ 11,883:
 
====Iterative positive and negative====
<syntaxhighlight lang="python">def fib(n,x=[0,1]):
for i in range(abs(n)-1): x=[x[1],sum(x)]
return x[1]*pow(-1,abs(n)-1) if n<0 else x[1] if n else 0
Line 10,221 ⟶ 11,896:
 
===Recursive===
<syntaxhighlight lang="python">def fibRec(n):
if n < 2:
return n
Line 10,229 ⟶ 11,904:
===Recursive with Memoization===
 
<syntaxhighlight lang="python">def fibMemo():
pad = {0:0, 1:1}
def func(n):
Line 10,251 ⟶ 11,926:
The recursive code as written two sections above is incredibly slow and inefficient due to the nested recursion calls. Although the memoization above makes the code run faster, it is at the cost of extra memory use. The below code is syntactically recursive but actually encodes the efficient iterative process, and thus doesn't require memoization:
 
<syntaxhighlight lang="python">def fibFastRec(n):
def fib(prvprv, prv, c):
if c < 1:
Line 10,262 ⟶ 11,937:
 
===Generative===
<syntaxhighlight lang="python">def fibGen(n):
a, b = 0, 1
while n>0:
Line 10,268 ⟶ 11,943:
a, b, n = b, a+b, n-1</syntaxhighlight>
====Example use====
<syntaxhighlight lang="python">
>>> [i for i in fibGen(11)]
 
Line 10,276 ⟶ 11,951:
===Matrix-Based===
Translation of the matrix-based approach used in F#.
<syntaxhighlight lang="python">
def prevPowTwo(n):
'Gets the power of two that is less than or equal to the given input'
Line 10,311 ⟶ 11,986:
===Large step recurrence===
This is much faster for a single, large value of n:
<syntaxhighlight lang="python">def fib(n, c={0:1, 1:1}):
if n not in c:
x = n // 2
Line 10,321 ⟶ 11,996:
===Same as above but slightly faster===
Putting the dictionary outside the function makes this about 2 seconds faster, could just make a wrapper:
<syntaxhighlight lang="python">F = {0: 0, 1: 1, 2: 1}
def fib(n):
if n in F:
Line 10,332 ⟶ 12,007:
===Generative with Recursion===
This can get very slow and uses a lot of memory. Can be sped up by caching the generator results.
<syntaxhighlight lang="python">def fib():
"""Yield fib[n+1] + fib[n]"""
yield 1 # have to start somewhere
Line 10,347 ⟶ 12,022:
 
'''Another version of recursive generators solution, starting from 0'''
<syntaxhighlight lang=Python"python">from itertools import islice
 
def fib():
Line 10,363 ⟶ 12,038:
The Fibonacci series can be defined quite simply and efficiently as a scan or accumulation, in which the accumulator is a pair of the two last numbers.
{{Works with|Python|3.7}}
<syntaxhighlight lang="python">'''Fibonacci accumulation'''
 
from itertools import accumulate, chain
Line 10,401 ⟶ 12,076:
A fold can be understood as an amnesic scan, and functools.reduce can provide a useful and efficient re-write of the scanning version above, if we only need the Nth term in the series:
{{Works with|Python|3.7}}
<syntaxhighlight lang="python">'''Nth Fibonacci term (by folding)'''
 
from functools import reduce
Line 10,426 ⟶ 12,101:
 
{{Works with|Python|3.9}}
<syntaxhighlight lang="python">
def fib(n):
from functools import reduce
Line 10,433 ⟶ 12,108:
 
===Array and Range===
<syntaxhighlight lang="python">fibseq = [1,1,]
fiblength = 21
for x in range(1,fiblength-1):
Line 10,445 ⟶ 12,120:
 
===Minimal from Russia===
<syntaxhighlight lang="python">fi1=fi2=fi3=1 # FIB Russia rextester.com/FEEJ49204
for da in range(1, 88): # Danilin
print("."*(20-len(str(fi3))), end=' ')
Line 10,465 ⟶ 12,140:
.. 679891637638612258
. 1100087778366101931</pre>
 
=={{header|QB64}}==
''CBTJD'': 2020/03/13
<syntaxhighlight lang=qbasic>_DEFINE F AS _UNSIGNED _INTEGER64
CLS
PRINT
PRINT "Enter 40 to more easily see the difference in calculation speeds."
PRINT
INPUT "Enter n for Fibonacci(n): ", n
PRINT
PRINT " Analytic Method (Fastest): F("; LTRIM$(STR$(n)); ") ="; fA(n)
PRINT "Iterative Method (Fast): F("; LTRIM$(STR$(n)); ") ="; fI(n)
PRINT "Recursive Method (Slow): F("; LTRIM$(STR$(n)); ") ="; fR(n)
END
 
' === Analytic Fibonacci Function (Fastest)
FUNCTION fA (n)
fA = INT(0.5 + (((SQR(5) + 1) / 2) ^ n) / SQR(5))
END FUNCTION
 
' === Iterative Fibonacci Function (Fast)
FUNCTION fI (n)
FOR i = 1 TO n
IF i < 3 THEN a = 1: b = 1
t = fI + b: fI = b: b = t
NEXT
END FUNCTION
 
' === Recursive Fibonacci function (Slow)
FUNCTION fR (n)
IF n <= 1 THEN
fR = n
ELSE
fR = fR(n - 1) + fR(n - 2)
END IF
END FUNCTION
</syntaxhighlight>
 
=={{header|Qi}}==
===Recursive===
<syntaxhighlight lang="qi">
(define fib
0 -> 0
Line 10,513 ⟶ 12,151:
</syntaxhighlight>
===Iterative===
<syntaxhighlight lang="qi">
(define fib-0
V2 V1 0 -> V2
Line 10,524 ⟶ 12,162:
=={{header|Quackery}}==
 
<syntaxhighlight lang=Quackery"quackery"> [ 0 1 rot times [ tuck + ] drop ] is fibo ( n --> n )
 
100 fibo echo</syntaxhighlight>
Line 10,534 ⟶ 12,172:
=={{header|R}}==
===Iterative positive and negative===
<syntaxhighlight lang="python">fib=function(n,x=c(0,1)) {
if (abs(n)>1) for (i in seq(abs(n)-1)) x=c(x[2],sum(x))
if (n<0) return(x[2]*(-1)^(abs(n)-1)) else if (n) return(x[2]) else return(0)
Line 10,551 ⟶ 12,189:
</pre>
===Other methods===
<syntaxhighlight lang=R"r"># recursive
recfibo <- function(n) {
if ( n < 2 ) n
Line 10,599 ⟶ 12,237:
 
=={{header|Ra}}==
<syntaxhighlight lang=Ra"ra">
class FibonacciSequence
**Prints the nth fibonacci number**
Line 10,650 ⟶ 12,288:
 
===Tail Recursive===
<syntaxhighlight lang=Racket"racket">
(define (fib n)
(let loop ((cnt 0) (a 0) (b 1))
Line 10,658 ⟶ 12,296:
</syntaxhighlight>
 
<syntaxhighlight lang=Racket"racket">
(define (fib n (a 0) (b 1))
(if (< n 2)
Line 10,666 ⟶ 12,304:
 
===Matrix Form===
<syntaxhighlight lang=Racket"racket">
#lang racket
 
Line 10,681 ⟶ 12,319:
 
===Foldl Form===
<syntaxhighlight lang=Racket"racket">
(define (fib n)
(car (foldl (lambda (y x)
Line 10,694 ⟶ 12,332:
 
This constructs the fibonacci sequence as a lazy infinite list.
<syntaxhighlight lang=perl6"raku" line>constant @fib = 0, 1, *+* ... *;</syntaxhighlight>
 
If you really need a function for it:
<syntaxhighlight lang=perl6"raku" line>sub fib ($n) { @fib[$n] }</syntaxhighlight>
 
To support negative indices:
<syntaxhighlight lang=perl6"raku" line>constant @neg-fib = 0, 1, *-* ... *;
sub fib ($n) { $n >= 0 ?? @fib[$n] !! @neg-fib[-$n] }</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang=perl6"raku" line>sub fib (Int $n --> Int) {
$n > 1 or return $n;
my ($prev, $this) = 0, 1;
Line 10,712 ⟶ 12,350:
 
===Recursive===
<syntaxhighlight lang=perl6"raku" line>proto fib (Int $n --> Int) {*}
multi fib (0) { 0 }
multi fib (1) { 1 }
Line 10,719 ⟶ 12,357:
=={{header|Rapira}}==
===Iterative===
<syntaxhighlight lang=Rapira"rapira">fun fibonacci(n)
if n = 0 then
return 0
Line 10,730 ⟶ 12,368:
 
=={{header|RASEL}}==
<syntaxhighlight lang="text">1&-:?v2\:2\01\--2\
>$.@</syntaxhighlight>
 
=={{header|RATFOR}}==
<syntaxhighlight lang="RATFOR">
program Fibonacci
#
integer*4 count, loop
integer*4 num1, num2, fib
 
1 format(A)
2 format(I4)
3 format(I6,' ')
4 format(' ')
write(6,1,advance='no')'How Many: '
read(5,2)count
 
num1 = 0
num2 = 1
write(6,3,advance='no')num1
write(6,3,advance='no')num2
 
for (loop = 3; loop<=count; loop=loop+1)
{
fib = num1 + num2
write(6,3,advance='no')fib
num1 = num2
num2 = fib
}
write(6,4)
end
</syntaxhighlight>
 
 
=={{header|Red}}==
(unnecessarily, but pleasantly palindromic)
<syntaxhighlight lang="red">Red>palindrome: [fn: fn-1 + fn-1: fn]
 
palindrome: [fn: fn-1 + fn-1: fn]
fibonacci: func [n][
fn-1: 0
Line 10,741 ⟶ 12,412:
loop n palindrome
]</syntaxhighlight>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
= <Prout <Repeat 18 Fibonacci 1 1>>
} ;
 
Repeat {
0 s.F e.X = e.X;
s.N s.F e.X = <Repeat <- s.N 1> s.F <Mu s.F e.X>>;
};
 
Fibonacci {
e.X s.A s.B = e.X s.A s.B <+ s.A s.B>;
};</syntaxhighlight>
{{out}}
<pre>1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765</pre>
 
=={{header|Relation}}==
<syntaxhighlight lang=Relation"relation">
function fibonacci (n)
if n < 2
Line 10,763 ⟶ 12,450:
=={{header|Retro}}==
===Recursive===
<syntaxhighlight lang=Retro"retro">: fib ( n-m ) dup [ 0 = ] [ 1 = ] bi or if; [ 1- fib ] sip [ 2 - fib ] do + ;</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang=Retro"retro">: fib ( n-N )
[ 0 1 ] dip [ over + swap ] times drop ;</syntaxhighlight>
 
Line 10,774 ⟶ 12,461:
 
This version of the REXX program can also handle &nbsp; ''negative'' &nbsp; Fibonacci numbers.
<syntaxhighlight lang="rexx">/*REXX program calculates the Nth Fibonacci number, N can be zero or negative. */
numeric digits 210000 /*be able to handle ginormous numbers. */
parse arg x y . /*allow a single number or a range. */
Line 10,889 ⟶ 12,576:
Fibonacci(10000) has a length of 2090 decimal digits
</pre>
 
=={{header|Rhovas}}==
Solutions support arbitrarily large numbers as Rhovas's <code>Integer</code> type is arbitrary-precision (Java <code>BigInteger</code>). Additional notes:
* <code>require num >= 0;</code> asserts input range preconditions, throwing on negative numbers
 
===Iterative===
Standard iterative solution using a <code>for</code> loop:
* <code>range(1, num, :incl)</code> creates an inclusive range (<code>1 <= i <= num</code>) for iteration.
** The loop uses <code>_</code> as the variable name since the value is unused.
 
<syntaxhighlight lang="scala">
func fibonacci(num: Integer): Integer {
require num >= 0;
var previous = 1;
var current = 0;
for (val _ in range(1, num, :incl)) {
val next = current + previous;
previous = current;
current = next;
}
return current;
}
</syntaxhighlight>
 
===Recursive===
Standard recursive solution using a pattern matching approach:
* <code>match</code> without arguments is a ''conditional match'', which works like <code>if/else</code> chains.
* Rhovas doesn't perform tail-call optimization yet, hence why this solution isn't tail recursive.
 
<syntaxhighlight lang="scala">
func fibonacci(num: Integer): Integer {
require num >= 0;
match {
num == 0: return 0;
num == 1: return 1;
else: return fibonacci(num - 1) + fibonacci(num - 2);
}
}
</syntaxhighlight>
 
===Negatives===
Standard solution using a pattern matching approach, delegating to an existing <code>positiveFibonacci</code> solution (as shown above). For negative fibonacci numbers, odd inputs return positive results while evens return negatives.
 
<syntaxhighlight lang="scala">
func fibonacci(num: Integer): Integer {
match {
num >= 0: return positiveFibonacci(num);
num.mod(2) != 0: return positiveFibonacci(-num);
else: return -positiveFibonacci(-num);
}
}
</syntaxhighlight>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
give n
x = fib(n)
Line 10,903 ⟶ 12,642:
=={{header|Rockstar}}==
===Iterative (minimized)===
<syntaxhighlight lang=Rockstar"rockstar">
Fibonacci takes Number
FNow is 0
Line 10,917 ⟶ 12,656:
 
===Iterative (idiomatic)===
<syntaxhighlight lang=Rockstar"rockstar">
Love takes Time
My love was addictions
Line 10,935 ⟶ 12,674:
 
===Recursive===
<syntaxhighlight lang=Rockstar"rockstar">
The Italian takes a lover, a kiss, a promise
love is population
Line 10,954 ⟶ 12,693:
Whisper The Italian taking your heart, your mind, your soul
</syntaxhighlight>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
===Iterative===
≪ 0 1
0 4 ROLL '''START'''
OVER + SWAP
'''NEXT''' SWAP DROP
≫ '<span style="color:blue">→FIB</span>' STO
≪ { } 0 20 '''FOR''' j j <span style="color:blue">→FIB</span> + '''NEXT''' ≫ EVAL
 
===Recursive===
≪ '''IF''' DUP 2 > '''THEN'''
DUP 1 - <span style="color:blue">→FIB</span>
SWAP 2 - <span style="color:blue">→FIB</span> +
'''ELSE''' SIGN '''END'''
≫ '<span style="color:blue">→FIB</span>' STO
 
{{out}}
<pre>
1: { 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 }
</pre>
===Fast recursive===
A much better recursive approach, based on the formulas: <code>F(2k) = [2*F(k-1) + F(k)]*F(k)</code> and <code>F(2k+1) = F(k)² + F(k+1)²</code>
≪ '''IF''' DUP 2 ≤ '''THEN''' SIGN '''ELSE'''
'''IF''' DUP 2 MOD
'''THEN''' 1 - 2 / DUP <span style="color:blue">→FIB</span> SQ SWAP 1 + <span style="color:blue">→FIB</span> SQ +
'''ELSE''' 2 / DUP <span style="color:blue">→FIB</span> DUP ROT 1 - <span style="color:blue">→FIB</span> 2 * + *
'''END END'''
≫ '<span style="color:blue">→FIB</span>' STO
 
=={{header|Ruby}}==
===Iterative===
<syntaxhighlight lang="ruby">def fib(n)
if n < 2
n
Line 10,976 ⟶ 12,746:
 
===Recursive===
<syntaxhighlight lang="ruby">def fib(n, sequence=[1])
return sequence.last if n == 0
 
Line 10,987 ⟶ 12,757:
 
===Recursive with Memoization===
<syntaxhighlight lang="ruby"># Use the Hash#default_proc feature to
# lazily calculate the Fibonacci numbers.
 
Line 11,002 ⟶ 12,772:
 
===Matrix===
<syntaxhighlight lang="ruby">require 'matrix'
 
# To understand why this matrix is useful for Fibonacci numbers, remember
Line 11,040 ⟶ 12,810:
 
===Generative===
<syntaxhighlight lang="ruby">fib = Enumerator.new do |y|
f0, f1 = 0, 1
loop do
Line 11,055 ⟶ 12,825:
"Fibers are primitives for implementing light weight cooperative concurrency in Ruby. Basically they are a means of creating code blocks that can be paused and resumed, much like threads. The main difference is that they are never preempted and that the scheduling must be done by the programmer and not the VM." [http://www.ruby-doc.org/ruby-1.9/classes/Fiber.html]
 
<syntaxhighlight lang="ruby">fib = Fiber.new do
a,b = 0,1
loop do
Line 11,065 ⟶ 12,835:
 
using a lambda
<syntaxhighlight lang="ruby">def fib_gen
a, b = 1, 1
lambda {ret, a, b = a, b, a+b; ret}
Line 11,087 ⟶ 12,857:
 
===Binet's Formula===
<syntaxhighlight lang="ruby">def fib
phi = (1 + Math.sqrt(5)) / 2
((phi**self - (-1 / phi)**self) / Math.sqrt(5)).to_i
Line 11,100 ⟶ 12,870:
=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
</pre>
 
=={{header|Run BASIC}}==
<syntaxhighlight lang=runbasic>for i = 0 to 10
print i;" ";fibR(i);" ";fibI(i)
next i
end
function fibR(n)
if n < 2 then fibR = n else fibR = fibR(n-1) + fibR(n-2)
end function
function fibI(n)
b = 1
for i = 1 to n
t = a + b
a = b
b = t
next i
fibI = a
end function</syntaxhighlight>
 
=={{header|Rust}}==
===Iterative===
<syntaxhighlight lang="rust">fn main() {
let mut prev = 0;
// Rust needs this type hint for the checked_add method
Line 11,136 ⟶ 12,886:
 
===Recursive===
<syntaxhighlight lang="rust">use std::mem;
fn main() {
fibonacci(0,1);
Line 11,150 ⟶ 12,900:
 
===Recursive (with pattern matching)===
<syntaxhighlight lang="rust">fn fib(n: u32) -> u32 {
match n {
0 => 0,
Line 11,159 ⟶ 12,909:
 
===Tail recursive (with pattern matching)===
<syntaxhighlight lang="rust">fn fib_tail_recursive(nth: usize) -> usize {
fn fib_tail_iter(n: usize, prev_fib: usize, fib: usize) -> usize {
match n {
Line 11,170 ⟶ 12,920:
 
===Analytic===
<syntaxhighlight lang="rust">fn main() {
for num in fibonacci_sequence() {
println!("{}", num);
Line 11,186 ⟶ 12,936:
===Using an Iterator===
Iterators are very idiomatic in rust, though they may be overkill for such a simple problem.
<syntaxhighlight lang="rust">use std::mem;
 
struct Fib {
Line 11,218 ⟶ 12,968:
 
====Iterator "Successors"====
<syntaxhighlight lang="rust">fn main() {
std::iter::successors(Some((1u128, 0)), |&(a, b)| a.checked_add(b).map(|s| (b, s)))
.for_each(|(_, u)| println!("{}", u));
}</syntaxhighlight>
 
=={{header|S-BASIC}}==
Note that the 23rd Fibonacci number (=28657) is the largest that can be generated without overflowing S-BASIC's integer data type.
<syntaxhighlight lang=basic>
rem - iterative function to calculate nth fibonacci number
function fibonacci(n = integer) = integer
var f, i, p1, p2 = integer
p1 = 0
p2 = 1
if n = 0 then
f = 0
else
for i = 1 to n
f = p1 + p2
p2 = p1
p1 = f
next i
end = f
 
rem - exercise the function
var i = integer
for i = 0 to 10
print fibonacci(i);
next i
 
end
</syntaxhighlight>
{{out}}
<pre> 0 1 1 2 3 5 8 13 21 34 55
</pre>
 
=={{header|SAS}}==
 
=== Iterative ===
 
This code builds a table <code>fib</code> holding the first few values of the Fibonacci sequence.
<syntaxhighlight lang="sas">data fib;
 
<syntaxhighlight lang=sas>data fib;
a=0;
b=1;
Line 11,272 ⟶ 12,990:
 
=== Naive recursive ===
 
This code provides a simple example of defining a function and using it recursively. One of the members of the sequence is written to the log.
 
<syntaxhighlight lang="sas">options cmplib=work.f;
 
proc fcmp outlib=work.f.p;
Line 11,292 ⟶ 13,009:
=={{header|Sather}}==
The implementations use the arbitrary precision class INTI.
<syntaxhighlight lang="sather">class MAIN is
 
-- RECURSIVE --
Line 11,329 ⟶ 13,046:
=={{header|Scala}}==
===Recursive===
<syntaxhighlight lang="scala">def fib(i: Int): Int = i match {
case 0 => 0
case 1 => 1
Line 11,336 ⟶ 13,053:
 
===Lazy sequence===
<syntaxhighlight lang="scala">lazy val fib: LazyList[Int] = 0 #:: 1 #:: fib.zip(fib.tail).map { case (a, b) => a + b }</syntaxhighlight>
 
===Tail recursive===
<syntaxhighlight lang="scala">import scala.annotation.tailrec
@tailrec
final def fib(x: Int, prev: BigInt = 0, next: BigInt = 1): BigInt = x match {
Line 11,347 ⟶ 13,064:
 
===foldLeft===
<syntaxhighlight lang="scala">// Fibonacci using BigInt with LazyList.foldLeft optimized for GC (Scala v2.13 and above)
// Does not run out of memory for very large Fibonacci numbers
def fib(n: Int): BigInt = {
Line 11,363 ⟶ 13,080:
 
===Iterator===
<syntaxhighlight lang="scala">val it: Iterator[Int] = Iterator.iterate((0, 1)) { case (a, b) => (b, a + b) }.map(_._1)
 
def fib(n: Int): Int = it.drop(n).next()
Line 11,372 ⟶ 13,089:
=={{header|Scheme}}==
===Iterative===
<syntaxhighlight lang="scheme">(define (fib-iter n)
(do ((num 2 (+ num 1))
(fib-prev 1 fib)
Line 11,379 ⟶ 13,096:
 
===Recursive===
<syntaxhighlight lang="scheme">(define (fib-rec n)
(if (< n 2)
n
Line 11,386 ⟶ 13,103:
 
This version is tail recursive:
<syntaxhighlight lang="scheme">(define (fib n)
(let loop ((a 0) (b 1) (n n))
(if (= n 0) a
Line 11,398 ⟶ 13,115:
The following procedure generates the sequence of Fibonacci numbers using a simplified version of a lazy list/stream - since no memoization is requried, it just implements future values by using a zero parameter lambda "thunk" with a closure containing the last and the pre-calculated next value of the sequence; in this way it uses almost no memory during the sequence generation other than as required for the last and the next values of the sequence (note that the test procedure does not generate a linked list to contain the elements of the sequence to show, but rather displays each one by one in sequence):
 
<syntaxhighlight lang="scheme">
(define (fib)
(define (nxt lv nv) (cons nv (lambda () (nxt nv (+ lv nv)))))
Line 11,414 ⟶ 13,131:
 
===Dijkstra Algorithm===
<syntaxhighlight lang="scheme">;;; Fibonacci numbers using Edsger Dijkstra's algorithm
;;; http://www.cs.utexas.edu/users/EWD/ewd06xx/EWD654.PDF
 
Line 11,435 ⟶ 13,152:
 
=={{header|Scilab}}==
<syntaxhighlight lang="text"> clear
n=46
f1=0; f2=1
Line 11,454 ⟶ 13,171:
 
=={{header|sed}}==
<syntaxhighlight lang="sed">#!/bin/sed -f
 
# First we need to convert each number into the right number of ticks
Line 11,497 ⟶ 13,214:
=={{header|Seed7}}==
===Recursive===
<syntaxhighlight lang="seed7">const func integer: fib (in integer: number) is func
result
var integer: result is 1;
Line 11,513 ⟶ 13,230:
This funtion uses a bigInteger result:
 
<syntaxhighlight lang="seed7">const func bigInteger: fib (in integer: number) is func
result
var bigInteger: result is 1_;
Line 11,532 ⟶ 13,249:
=={{header|SequenceL}}==
===Recursive===
<syntaxhighlight lang="sequencel">fibonacci(n) :=
n when n < 2
else
Line 11,539 ⟶ 13,256:
 
===Tail Recursive===
<syntaxhighlight lang="sequencel">fibonacci(n) := fibonacciHelper(0, 1, n);
fibonacciHelper(prev, next, n) :=
Line 11,549 ⟶ 13,266:
 
===Matrix===
<syntaxhighlight lang="sequencel">fibonacci(n) := fibonacciHelper([[1,0],[0,1]], n);
 
fibonacciHelper(M(2), n) :=
Line 11,565 ⟶ 13,282:
 
=={{header|SETL}}==
<syntaxhighlight lang="setl">$ Print out the first ten Fibonacci numbers
$ This uses Set Builder Notation, it roughly means
$ 'collect fib(n) forall n in {0,1,2,3,4,5,6,7,8,9,10}'
Line 11,582 ⟶ 13,299:
 
=={{header|Shen}}==
<syntaxhighlight lang=Shen"shen">(define fib
0 -> 0
1 -> 1
Line 11,591 ⟶ 13,308:
=={{header|Sidef}}==
===Iterative===
<syntaxhighlight lang="ruby">func fib_iter(n) {
var (a, b) = (0, 1)
{ (a, b) = (b, a+b) } * n
Line 11,598 ⟶ 13,315:
 
===Recursive===
<syntaxhighlight lang="ruby">func fib_rec(n) {
n < 2 ? n : (__FUNC__(n-1) + __FUNC__(n-2))
}</syntaxhighlight>
 
===Recursive with memoization===
<syntaxhighlight lang="ruby">func fib_mem (n) is cached {
n < 2 ? n : (__FUNC__(n-1) + __FUNC__(n-2))
}</syntaxhighlight>
 
===Closed-form===
<syntaxhighlight lang="ruby">func fib_closed(n) {
define S = (1.25.sqrt + 0.5)
define T = (-S + 1)
Line 11,615 ⟶ 13,332:
 
===Built-in===
<syntaxhighlight lang="ruby">say fib(12) #=> 144</syntaxhighlight>
 
=={{header|Simula}}==
Straightforward iterative implementation.
<syntaxhighlight lang="simula">INTEGER PROCEDURE fibonacci(n);
INTEGER n;
BEGIN
Line 11,640 ⟶ 13,357:
SkookumScript's <code>Integer</code> class has a fast built-in <code>fibonnaci()</code> method.
 
<syntaxhighlight lang="javascript">42.fibonacci</syntaxhighlight>
 
SkookumScript is designed to work in tandem with C++ and its strength is at the high-level stage-direction of things. So when confronted with [http://skookumscript.com/blog/2016/07-11-fibonacci/ benchmarking scripting systems] it is genrally better to make a built-in call. Though in most practical cases this isn't necessary.
Line 11,648 ⟶ 13,365:
Simple recursive method in same <code>42.fibonacci</code> form as built-in form above.
 
<syntaxhighlight lang="javascript">// Assuming code is in Integer.fibonacci() method
() Integer
[
Line 11,656 ⟶ 13,373:
Recursive procedure in <code>fibonacci(42)</code> form.
 
<syntaxhighlight lang="javascript">// Assuming in fibonacci(n) procedure
(Integer n) Integer
[
Line 11,666 ⟶ 13,383:
Iterative method in <code>42.fibonacci</code> form.
 
<syntaxhighlight lang="javascript">// Assuming code is in Integer.fibonacci() method
() Integer
[
Line 11,689 ⟶ 13,406:
Though the best optimiation is to write it in C++ as with the built-in form that comes with SkookumScript.
 
<syntaxhighlight lang="javascript">// Bind : is faster than assignment :=
// loop is faster than to_pre (which uses a closure)
() Integer
Line 11,715 ⟶ 13,432:
 
=={{header|Slate}}==
<syntaxhighlight lang="slate">n@(Integer traits) fib
[
n <= 0 ifTrue: [^ 0].
Line 11,733 ⟶ 13,450:
 
iterative (slow):
<syntaxhighlight lang="smalltalk">Integer >> fibI
|aNMinus1 an t|
 
Line 11,745 ⟶ 13,462:
^ an</syntaxhighlight>
The recursive version although nice to read is the worst; it suffers from a huge stack requirement and a super poor performance (an anti-example for recursion):
<syntaxhighlight lang="smalltalk">Integer >> fibR
(self > 1) ifTrue:[
^ (self - 1) fibR + (self - 2) fibR
Line 11,752 ⟶ 13,469:
analytic (fast, but inexact, and limited to small n below 1475 if we use double precision IEEE floats):
<syntaxhighlight lang="smalltalk">Integer >> fibBinet
|phi rPhi|
 
Line 11,760 ⟶ 13,477:
^ (1 / 5 sqrt) * ((phi raisedTo:self) - (rPhi raisedTo:self))</syntaxhighlight>
using more bits in the exponent, we can compute larger fibs (up to 23599 with x86 extended precision floats), but still inexact:
<syntaxhighlight lang="smalltalk">Integer >> fibBinetFloatE
|phi rPhi|
 
Line 11,767 ⟶ 13,484:
 
^ (1 / 5 sqrt) * ((phi raisedTo:self) - (rPhi raisedTo:self))</syntaxhighlight>
<syntaxhighlight lang="smalltalk">
(10 to:1e6 byFactor:10) do:[:n |
Transcript printCR:'----',n,'----'.
Line 11,840 ⟶ 13,557:
2000000 fib (builtin): 229ms (827461038 cycles)
10000000 fib (builtin): 2.769s (9970686190 cycles)</pre>
 
=={{header|smart BASIC}}==
 
The Iterative method is slow (relatively) and the Recursive method doubly so since it references the recursion function twice.
 
The N-th Term (fibN) function is much faster as it utilizes Binet's Formula.
 
<ul>
<li>fibR: Fibonacci Recursive</li>
<li>fibI: Fibonacci Iterative</li>
<li>fibN: Fibonacci N-th Term</li>
</ul>
 
<syntaxhighlight lang=qbasic>FOR i = 0 TO 15
PRINT fibR(i),fibI(i),fibN(i)
NEXT i
 
/* Recursive Method */
DEF fibR(n)
IF n <= 1 THEN
fibR = n
ELSE
fibR = fibR(n-1) + fibR(n-2)
ENDIF
END DEF
 
/* Iterative Method */
DEF fibI(n)
a = 0
b = 1
FOR i = 1 TO n
temp = a + b
a = b
b = temp
NEXT i
fibI = a
END DEF
 
/* N-th Term Method */
DEF fibN(n)
uphi = .5 + SQR(5)/2
lphi = .5 - SQR(5)/2
fibN = (uphi^n-lphi^n)/SQR(5)
END DEF</syntaxhighlight>
 
=={{header|SNOBOL4}}==
 
===Recursive===
<syntaxhighlight lang="snobol"> define("fib(a)") :(fib_end)
fib fib = lt(a,2) a :s(return)
fib = fib(a - 1) + fib(a - 2) :(return)
Line 11,898 ⟶ 13,570:
 
===Tail-recursive===
<syntaxhighlight lang=SNOBOL4"snobol4"> define('trfib(n,a,b)') :(trfib_end)
trfib trfib = eq(n,0) a :s(return)
trfib = trfib(n - 1, a + b, a) :(return)
Line 11,904 ⟶ 13,576:
 
===Iterative===
<syntaxhighlight lang=SNOBOL4"snobol4"> define('ifib(n)f1,f2') :(ifib_end)
ifib ifib = le(n,2) 1 :s(return)
f1 = 1; f2 = 1
Line 11,916 ⟶ 13,588:
Note: Snobol4+ lacks built-in sqrt( ) function.
 
<syntaxhighlight lang=SNOBOL4"snobol4"> define('afib(n)s5') :(afib_end)
afib s5 = sqrt(5)
afib = (((1 + s5) / 2) ^ n - ((1 - s5) / 2) ^ n) / s5
Line 11,924 ⟶ 13,596:
Test and display all, Fib 1 .. 10
 
<syntaxhighlight lang=SNOBOL4"snobol4">loop i = lt(i,10) i + 1 :f(show)
s1 = s1 fib(i) ' ' ; s2 = s2 trfib(i,0,1) ' '
s3 = s3 ifib(i) ' '; s4 = s4 afib(i) ' ' :(loop)
Line 11,940 ⟶ 13,612:
 
===Iterative===
<syntaxhighlight lang="snusp"> @!\+++++++++# /<<+>+>-\
fib\==>>+<<?!/>!\ ?/\
#<</?\!>/@>\?-<<</@>/@>/>+<-\
Line 11,946 ⟶ 13,618:
 
===Recursive===
<syntaxhighlight lang="snusp"> /========\ />>+<<-\ />+<-\
fib==!/?!\-?!\->+>+<<?/>>-@\=====?/<@\===?/<#
| #+==/ fib(n-2)|+fib(n-1)|
\=====recursion======/!========/</syntaxhighlight>
 
=={{header|Softbridge BASIC}}==
===Iterative===
<syntaxhighlight lang=basic>
Function Fibonacci(n)
x = 0
y = 1
i = 0
n = ABS(n)
If n < 2 Then
Fibonacci = n
Else
Do Until (i = n)
sum = x+y
x=y
y=sum
i=i+1
Loop
Fibonacci = x
End If
 
End Function
</syntaxhighlight>
 
=={{header|Spin}}==
Line 11,980 ⟶ 13,629:
{{works with|HomeSpun}}
{{works with|OpenSpin}}
<syntaxhighlight lang="spin">con
_clkmode = xtal1 + pll16x
_clkfreq = 80_000_000
Line 12,007 ⟶ 13,656:
=={{header|SPL}}==
=== Analytic ===
<syntaxhighlight lang="spl">fibo(n)=
s5 = #.sqrt(5)
<= (((1+s5)/2)^n-((1-s5)/2)^n)/s5
.</syntaxhighlight>
=== Iterative ===
<syntaxhighlight lang="spl">fibo(n)=
? n<2, <= n
f2 = 0
Line 12,024 ⟶ 13,673:
.</syntaxhighlight>
=== Recursive ===
<syntaxhighlight lang="spl">fibo(n)=
? n<2, <= n
<= fibo(n-1)+fibo(n-2)
Line 12,032 ⟶ 13,681:
=== Analytic ===
As a running sum:
<syntaxhighlight lang=SQL"sql">
select round ( exp ( sum (ln ( ( 1 + sqrt( 5 ) ) / 2)
) over ( order by level ) ) / sqrt( 5 ) ) fibo
Line 12,055 ⟶ 13,704:
</pre>
As a power:
<syntaxhighlight lang=SQL"sql">
select round ( power( ( 1 + sqrt( 5 ) ) / 2, level ) / sqrt( 5 ) ) fib
from dual
Line 12,081 ⟶ 13,730:
 
Oracle 12c required
<syntaxhighlight lang="sql">
SQL> with fib(e,f) as (select 1, 1 from dual union all select e+f,e from fib where e <= 55) select f from fib;
 
Line 12,102 ⟶ 13,751:
{{works with|PostgreSQL}}
 
<syntaxhighlight lang="postgresql">CREATE FUNCTION fib(n int) RETURNS numeric AS $$
-- This recursive with generates endless list of Fibonacci numbers.
WITH RECURSIVE fibonacci(current, previous) AS (
Line 12,132 ⟶ 13,781:
=={{header|SSEM}}==
Calculates the tenth Fibonacci number. To calculate the <i>n</i>th, change the initial value of the counter to <i>n</i>-1 (subject to the restriction that the answer must be small enough to fit in a signed 32-bit integer, the SSEM's only data type). The algorithm is basically straightforward, but the absence of an Add instruction makes the implementation a little more complicated than it would otherwise be.
<syntaxhighlight lang="ssem">10101000000000100000000000000000 0. -21 to c acc = -n
01101000000001100000000000000000 1. c to 22 temp = acc
00101000000001010000000000000000 2. Sub. 20 acc -= m
Line 12,161 ⟶ 13,810:
=={{header|Stata}}==
 
<syntaxhighlight lang="stata">program fib
args n
clear
Line 12,171 ⟶ 13,820:
An implementation using '''[https://www.stata.com/help.cgi?dyngen dyngen]'''.
 
<syntaxhighlight lang="stata">program fib
args n
clear
Line 12,203 ⟶ 13,852:
 
=== Mata ===
<syntaxhighlight lang="stata">. mata
: function fib(n) {
return((((1+sqrt(5))/2):^n-((1-sqrt(5))/2):^n)/sqrt(5))
Line 12,217 ⟶ 13,866:
 
=={{header|StreamIt}}==
<syntaxhighlight lang="streamit">void->int feedbackloop Fib {
join roundrobin(0,1);
body in->int filter {
Line 12,231 ⟶ 13,880:
===Recursive===
nth fibonacci term for positive n
<syntaxhighlight lang=SuperCollider"supercollider">
f = { |n| if(n < 2) { n } { f.(n-1) + f.(n-2) } };
(0..20).collect(f)
Line 12,237 ⟶ 13,886:
 
nth fibonacci term for positive and negative n.
<syntaxhighlight lang=SuperCollider"supercollider">
f = { |n| var u = neg(sign(n)); if(abs(n) < 2) { n } { f.(2 * u + n) + f.(u + n) } };
(-20..20).collect(f)
Line 12,243 ⟶ 13,892:
 
===Analytic===
<syntaxhighlight lang=SuperCollider"supercollider">(
f = { |n|
var sqrt5 = sqrt(5);
Line 12,254 ⟶ 13,903:
 
===Iterative===
<syntaxhighlight lang=SuperCollider"supercollider">
f = { |n| var a = [1, 1]; n.do { a = a.addFirst(a[0] + a[1]) }; a.reverse };
f.(18)
Line 12,261 ⟶ 13,910:
=={{header|Swift}}==
===Analytic===
<syntaxhighlight lang=Swift"swift">import Cocoa
 
func fibonacci(n: Int) -> Int {
Line 12,275 ⟶ 13,924:
 
===Iterative===
<syntaxhighlight lang=Swift"swift">func fibonacci(n: Int) -> Int {
if n < 2 {
return n
Line 12,287 ⟶ 13,936:
}</syntaxhighlight>
Sequence:
<syntaxhighlight lang="swift">func fibonacci() -> SequenceOf<UInt> {
return SequenceOf {() -> GeneratorOf<UInt> in
var window: (UInt, UInt, UInt) = (0, 0, 1)
Line 12,298 ⟶ 13,947:
 
===Recursive===
<syntaxhighlight lang=Swift"swift">func fibonacci(n: Int) -> Int {
if n < 2 {
return n
Line 12,311 ⟶ 13,960:
===Recursive simple===
The simplest exponential-time recursive algorithm only handling positive N. Note that the "#" is the tailspin internal recursion which sends the value to the matchers. In this case where there is no initial block and no templates state, we could equivalently write the templates name "nthFibonacci" in place of the "#" to do a normal recursion.
<syntaxhighlight lang="tailspin">
templates nthFibonacci
when <=0|=1> do $ !
Line 12,320 ⟶ 13,969:
===Iterative, mutable state===
We could use the templates internal mutable state, still only positive N.
<syntaxhighlight lang="tailspin">
templates nthFibonacci
@: {n0: 0"1", n1: 1"1"};
Line 12,328 ⟶ 13,977:
</syntaxhighlight>
To handle negatives, we can keep track of the sign and send it to the matchers.
<syntaxhighlight lang="tailspin">
templates nthFibonacci
@: {n0: 0"1", n1: 1"1"};
Line 12,343 ⟶ 13,992:
===State machine===
Instead of mutating state, we could just recurse internally on a state structure.
<syntaxhighlight lang="tailspin">
templates nthFibonacci
{ N: ($)"1", n0: 0"1", n1: 1"1" } -> #
Line 12,373 ⟶ 14,022:
====Iterative====
{{trans|Perl}}
<syntaxhighlight lang="tcl">proc fibiter n {
if {$n < 2} {return $n}
set prev 1
Line 12,383 ⟶ 14,032:
}</syntaxhighlight>
====Recursive====
<syntaxhighlight lang="tcl">proc fib {n} {
if {$n < 2} then {expr {$n}} else {expr {[fib [expr {$n-1}]]+[fib [expr {$n-2}]]} }
}</syntaxhighlight>
 
The following {{works with|Tcl|8.5}}: defining a procedure in the <code>::tcl::mathfunc</code> namespace allows that proc to be used as a function in <code>[http://www.tcl.tk/man/tcl8.5/TclCmd/expr.htm expr]</code> expressions.
<syntaxhighlight lang="tcl">proc tcl::mathfunc::fib {n} {
if { $n < 2 } {
return $n
Line 12,402 ⟶ 14,051:
E.g.:
 
<syntaxhighlight lang="tcl">expr {fib(7)} ;# ==> 13
 
namespace path tcl::mathfunc #; or, interp alias {} fib {} tcl::mathfunc::fib
Line 12,409 ⟶ 14,058:
====Tail-Recursive====
In Tcl 8.6 a ''tailcall'' function is available to permit writing tail-recursive functions in Tcl. This makes deeply recursive functions practical. The availability of large integers also means no truncation of larger numbers.
<syntaxhighlight lang="tcl">proc fib-tailrec {n} {
proc fib:inner {a b n} {
if {$n < 1} {
Line 12,426 ⟶ 14,075:
===Handling Negative Numbers===
====Iterative====
<syntaxhighlight lang="tcl">proc fibiter n {
if {$n < 0} {
set n [expr {abs($n)}]
Line 12,444 ⟶ 14,093:
fibiter -6 ;# ==> -8</syntaxhighlight>
====Recursive====
<syntaxhighlight lang="tcl">proc tcl::mathfunc::fib {n} {expr {$n<-1 ? -1**($n+1) * fib(abs($n)) : $n<2 ? $n : fib($n-1) + fib($n-2)}}
expr {fib(-5)} ;# ==> 5
expr {fib(-6)} ;# ==> -8</syntaxhighlight>
Line 12,450 ⟶ 14,099:
This works up to <math>fib(70)</math>, after which the limited precision of IEEE double precision floating point arithmetic starts to show.<br>
{{works with|Tcl|8.5}}
<syntaxhighlight lang="tcl">proc fib n {expr {round((.5 + .5*sqrt(5)) ** $n / sqrt(5))}}</syntaxhighlight>
 
=={{header|Tern}}==
 
===Recursive===
<syntaxhighlight lang="tern">func fib(n) {
if (n < 2) {
return 1;
Line 12,463 ⟶ 14,112:
 
===Coroutine===
<syntaxhighlight lang="tern">func fib(n) {
let a = 1;
let b = 2;
Line 12,473 ⟶ 14,122:
}</syntaxhighlight>
 
=={{header|TI-83 BASICSR-56}}==
Sequence table:
<syntaxhighlight lang=ti83b>[Y=]
nMin=0
u(n)=u(n-1)+u(n-2)
u(nMin)={1,0}
[TABLE]
n u(n)
------- -------
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144 </syntaxhighlight>
 
{| class="wikitable"
Iterative:
|+ Texas Instruments SR-56 Program Listing for "Fibonacci Sequence"
<syntaxhighlight lang=ti83b>{0,1
|-
While 1
! Display !! Key !! Display !! Key !! Display !! Key !! Display !! Key
Disp Ans(1
|-
{Ans(2),sum(Ans
| 00 33 || STO || 25 || || 50 || || 75 ||
End</syntaxhighlight>
|-
| 01 00 || 0 || 26 || || 51 || || 76 ||
|-
| 02 01 || 1 || 27 || || 52 || || 77 ||
|-
| 03 33 || STO || 28 || || 53 || || 78 ||
|-
| 04 01 || 1 || 29 || || 54 || || 79 ||
|-
| 05 00 || 0 || 30 || || 55 || || 80 ||
|-
| 06 84 || + || 31 || || 56 || || 81 ||
|-
| 07 39 || *EXC || 32 || || 57 || || 82 ||
|-
| 08 01 || 1 || 33 || || 58 || || 83 ||
|-
| 09 94 || = || 34 || || 59 || || 84 ||
|-
| 10 27 || *dsz || 35 || || 60 || || 85 ||
|-
| 11 00 || 0 || 36 || || 61 || || 86 ||
|-
| 12 06 || 6 || 37 || || 62 || || 87 ||
|-
| 13 41 || R/S || 38 || || 63 || || 88 ||
|-
| 14 22 || GTO || 39 || || 64 || || 89 ||
|-
| 15 00 || 0 || 40 || || 65 || || 90 ||
|-
| 16 06 || 6 || 41 || || 66 || || 91 ||
|-
| 17 || || 42 || || 67 || || 92 ||
|-
| 18 || || 43 || || 68 || || 93 ||
|-
| 19 || || 44 || || 69 || || 94 ||
|-
| 20 || || 45 || || 70 || || 95 ||
|-
| 21 || || 46 || || 71 || || 96 ||
|-
| 22 || || 47 || || 72 || || 97 ||
|-
| 23 || || 48 || || 73 || || 98 ||
|-
| 24 || || 49 || || 74 || || 99 ||
|}
 
Asterisk denotes 2nd function key.
Binet's formula:
<syntaxhighlight lang=ti83b>Prompt N
.5(1+√(5 //golden ratio
(Ans^N–(-Ans)^-N)/√(5</syntaxhighlight>
 
{| class="wikitable"
=={{header|TI-89 BASIC}}==
|+ Register allocation
===Recursive===
|-
Optimized implementation (too slow to be usable for ''n'' higher than about 12).
| 0: Nth term requested || 1: Last term || 2: Unused || 3: Unused || 4: Unused
|-
| 5: Unused || 6: Unused || 7: Unused || 8: Unused || 9: Unused
|}
 
Annotated listing:
<syntaxhighlight lang=ti89b>fib(n)
<syntaxhighlight lang="text">
when(n<2, n, fib(n-1) + fib(n-2))</syntaxhighlight>
STO 0 // Nth term requested := User input
1 STO 1 // Last term := 1
0 // Initial value: 0
+ *EXC 1 = // Calculate next term.
*dsz 0 6 // Loop while R0 positive
R/S // Done, show answer
GTO 0 6 // If user hits R/S calculate next term
</syntaxhighlight>
 
'''Usage:'''
===Iterative===
Unoptimized implementation (I think the for loop can be eliminated, but I'm not sure).
 
At the keypad enter a number N, then press RST R/S to calculate and display the Nth Fibonacci number. R/S for the following numbers.
<syntaxhighlight lang=ti89b>fib(n)
Func
Local a,b,c,i
0→a
1→b
For i,1,n
a→c
b→a
c+b→b
EndFor
a
EndFunc</syntaxhighlight>
 
{{in}}
=={{header|Tiny BASIC}}==
<pre>1 RST R/S</pre>
<syntaxhighlight lang=Tiny BASIC>10 LET A = 0
20 LET B = 1
30 PRINT "Which F_n do you want?"
40 INPUT N
50 IF N = 0 THEN GOTO 140
60 IF N = 1 THEN GOTO 120
70 LET C = B + A
80 LET A = B
90 LET B = C
100 LET N = N - 1
110 GOTO 60
120 PRINT B
130 END
140 PRINT 0
150 END
</syntaxhighlight>
 
{{out}}
=={{header|True BASIC}}==
<pre>1</pre>
<syntaxhighlight lang=qbasic>FUNCTION fibonacci (n)
LET n1 = 0
LET n2 = 1
FOR k = 1 TO ABS(n)
LET sum = n1 + n2
LET n1 = n2
LET n2 = sum
NEXT k
IF n < 0 THEN
LET fibonacci = n1 * ((-1) ^ ((-n) + 1))
ELSE
LET fibonacci = n1
END IF
END FUNCTION
 
{{in}}
PRINT fibonacci(0) ! 0
<pre>2 RST R/S</pre>
PRINT fibonacci(13) ! 233
PRINT fibonacci(-42) !-267914296
PRINT fibonacci(47) ! 2971215073
END</syntaxhighlight>
 
{{out}}
=={{header|TSE SAL}}==
<pre>1</pre>
<syntaxhighlight lang=TSE SAL>
 
{{in}}
<pre>3 RST R/S</pre>
 
{{out}}
<pre>2</pre>
 
{{in}}
<pre>10 RST R/S</pre>
 
{{out}}
<pre>55</pre>
<pre>R/S -> 89</pre>
<pre>R/S -> 144</pre>
 
=={{header|TI-57}}==
{| class="wikitable"
! Step
! Function
! Comment
|-
| 00
| align="center" | <code>STO</code> <code> 0 </code>
| R0 = n
|-
| 01
|align="center" | <code>C.t</code>
| R7 = 0
|-
| 02
|align="center" | <code> 1 </code>
| Display = 1
|-
| 03
|align="center" | <code>INV</code> <code>SUM</code> <code> 1 </code>
| R0 -= 1
|-
| 04
|align="center" | <code>Lbl</code> <code> 1 </code>
| loop
|-
| 05
|align="center" | <code> + </code>
|
|-
| 06
|align="center" | <code>x⮂t</code>
| Swap Display with R7
|-
| 07
|align="center" | <code> = </code>
| Display += R7
|-
| 08
|align="center" | <code>Dsz</code>
| R0 -= 1
|-
| 09
|align="center" | <code>GTO</code> <code>1</code>
| until R0 == 0
|-
| 10
|align="center" | <code>R/S</code>
| Stop
|-
| 11
|align="center" | <code>RST</code>
| Go back to step 0
|-
|}
10 <code>RST</code> <code>R/S</code>
{{out}}
<pre>
55.
</pre>
 
=={{header|TSE SAL}}==
<syntaxhighlight lang="tse sal">
// library: math: get: series: fibonacci <description></description> <version control></version control> <version>1.0.0.0.3</version> <version control></version control> (filenamemacro=getmasfi.s) [<Program>] [<Research>] [kn, ri, su, 20-01-2013 22:04:02]
INTEGER PROC FNMathGetSeriesFibonacciI( INTEGER nI )
Line 12,618 ⟶ 14,338:
UNTIL FALSE
END
 
</syntaxhighlight>
 
=={{header|Turing}}==
<syntaxhighlight lang="turing">% Recursive
function fibb (n: int) : int
if n < 2 then
Line 12,659 ⟶ 14,378:
 
=={{header|TUSCRIPT}}==
<syntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
ASK "What fibionacci number do you want?": searchfib=""
Line 12,690 ⟶ 14,409:
fibionacci 46=1836311903
</pre>
 
=={{header|Uiua}}==
{{works with|Uiua|0.10.0-dev.1}}
Simple recursive example with memoisation.
<syntaxhighlight lang="Uiua">
F ← |1 memo⟨+⊃(F-1)(F-2)|∘⟩<2.
F ⇡20
</syntaxhighlight>
 
=={{header|UNIX Shell}}==
{{works with|bash|3}}
<syntaxhighlight lang="bash">#!/bin/bash
 
a=0
Line 12,709 ⟶ 14,436:
{{works with|bash|3}}
 
<syntaxhighlight lang="bash">fib() {
local n=$1
[ $n -lt 2 ] && echo -n $n || echo -n $(( $( fib $(( n - 1 )) ) + $( fib $(( n - 2 )) ) ))
Line 12,717 ⟶ 14,444:
{{incorrect|UnixPipes|There is a race between parallel commands. <code>tee last</code> might open and truncate the file before <code>cat last</code> opens it. Then <code>cat last</code> pipes the empty file to ''xargs'', and ''expr'' reports a syntax error, and the script hangs forever.}}
 
<syntaxhighlight lang="bash">echo 1 |tee last fib ; tail -f fib | while read x
do
cat last | tee -a fib | xargs -n 1 expr $x + |tee last
Line 12,725 ⟶ 14,452:
{{trans|Python}}
===Iterative===
<syntaxhighlight lang="ursa">def fibIter (int n)
if (< n 2)
return n
Line 12,740 ⟶ 14,467:
=={{header|Ursala}}==
All three methods are shown here, and all have unlimited precision.
<syntaxhighlight lang=Ursala"ursala">#import std
#import nat
 
Line 12,759 ⟶ 14,486:
always chosen based on the argument. This test program computes the first
twenty Fibonacci numbers by all three methods.
<syntaxhighlight lang=Ursala"ursala">#cast %nLL
 
examples = <.iterative_fib,recursive_fib,analytical_fib>* iota20</syntaxhighlight>
Line 12,789 ⟶ 14,516:
Generate n'th fib by using binary recursion
 
<syntaxhighlight lang="v">[fib
[small?] []
[pred dup pred]
Line 12,799 ⟶ 14,526:
===Recursive===
Using int, but could easily replace with double, long, ulong, etc.
<syntaxhighlight lang="vala">
int fibRec(int n){
if (n < 2)
Line 12,810 ⟶ 14,537:
===Iterative===
Using int, but could easily replace with double, long, ulong, etc.
<syntaxhighlight lang="vala">
int fibIter(int n){
if (n < 2)
Line 12,830 ⟶ 14,557:
 
=={{header|VAX Assembly}}==
<syntaxhighlight lang=VAX"vax Assemblyassembly"> 0000 0000 1 .entry main,0
7E 7CFD 0002 2 clro -(sp) ;result buffer
5E DD 0005 3 pushl sp ;pointer to buffer
Line 12,865 ⟶ 14,592:
$
</syntaxhighlight>
 
=={{header|VBA}}==
Like Visual Basic .NET, but with keyword "Public" and type Variant (subtype Currency) instead of Decimal:
<syntaxhighlight lang=vb>Public Function Fib(ByVal n As Integer) As Variant
Dim fib0 As Variant, fib1 As Variant, sum As Variant
Dim i As Integer
fib0 = 0
fib1 = 1
For i = 1 To n
sum = fib0 + fib1
fib0 = fib1
fib1 = sum
Next i
Fib = fib0
End Function </syntaxhighlight>
With Currency type, maximum value is fibo(73).
 
The (slow) recursive version:
 
<syntaxhighlight lang=VBA>
Public Function RFib(Term As Integer) As Long
If Term < 2 Then RFib = Term Else RFib = RFib(Term - 1) + RFib(Term - 2)
End Function
</syntaxhighlight>
 
With Long type, maximum value is fibo(46).
 
=={{header|VBScript}}==
===Non-recursive, object oriented, generator===
Defines a generator class, with a default Get property. Uses Currency for larger-than-Long values. Tests for overflow and switches to Double. Overflow information also available from class.
 
====Class Definition:====
<syntaxhighlight lang=vb>class generator
dim t1
dim t2
dim tn
dim cur_overflow
Private Sub Class_Initialize
cur_overflow = false
t1 = ccur(0)
t2 = ccur(1)
tn = ccur(t1 + t2)
end sub
public default property get generated
on error resume next
 
generated = ccur(tn)
if err.number <> 0 then
generated = cdbl(tn)
cur_overflow = true
end if
t1 = ccur(t2)
if err.number <> 0 then
t1 = cdbl(t2)
cur_overflow = true
end if
t2 = ccur(tn)
if err.number <> 0 then
t2 = cdbl(tn)
cur_overflow = true
end if
tn = ccur(t1+ t2)
if err.number <> 0 then
tn = cdbl(t1) + cdbl(t2)
cur_overflow = true
end if
on error goto 0
end property
public property get overflow
overflow = cur_overflow
end property
end class</syntaxhighlight>
 
====Invocation:====
<syntaxhighlight lang=vb>dim fib
set fib = new generator
dim i
for i = 1 to 100
wscript.stdout.write " " & fib
if fib.overflow then
wscript.echo
exit for
end if
next</syntaxhighlight>
 
====Output:====
<syntaxhighlight lang=vbscript> 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 20365011074 32951280099 53316291173 86267571272 139583862445 225851433717 365435296162 591286729879 956722026041 1548008755920 2504730781961 4052739537881 6557470319842 10610209857723 17167680177565 27777890035288 44945570212853 72723460248141 117669030460994 190392490709135 308061521170129 498454011879264 806515533049393</syntaxhighlight>
 
=={{header|Vedit macro language}}==
===Iterative===
 
Calculate fibonacci(#1). Negative values return 0.
<syntaxhighlight lang="vedit">:FIBONACCI:
#11 = 0
#12 = 1
Line 12,972 ⟶ 14,607:
 
===Unlimited precision===
<syntaxhighlight lang="vedit">// Fibonacci, unlimited precision.
// input: #1 = n
// return: fibonacci(n) in text register 10
Line 13,029 ⟶ 14,664:
 
Test:
<syntaxhighlight lang="vedit">#1 = Get_Num("n: ", STATLINE)
Ins_Text("fibonacci(") Num_Ins(#1, LEFT+NOCR) Ins_Text(") = ")
Call("fibo_unlimited")
Line 13,038 ⟶ 14,673:
<pre>fibonacci(1000) = 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875</pre>
 
=={{header|VisualV Basic(Vlang)}}==
Update V (Vlang) to version 0.2.2
{{works with|Visual Basic|VB6 Standard}}
Maximum integer value (7*10^28) can be obtained by using decimal type, but decimal type is only a sub type of the variant type.
<syntaxhighlight lang=vb>Sub fibonacci()
Const n = 139
Dim i As Integer
Dim f1 As Variant, f2 As Variant, f3 As Variant 'for Decimal
f1 = CDec(0): f2 = CDec(1) 'for Decimal setting
Debug.Print "fibo("; 0; ")="; f1
Debug.Print "fibo("; 1; ")="; f2
For i = 2 To n
f3 = f1 + f2
Debug.Print "fibo("; i; ")="; f3
f1 = f2
f2 = f3
Next i
End Sub 'fibonacci</syntaxhighlight>
{{Out}}
<pre>fibo( 0 )= 0
fibo( 1 )= 1
fibo( 2 )= 1
...
fibo( 137 )= 19134702400093278081449423917
fibo( 138 )= 30960598847965113057878492344
fibo( 139 )= 50095301248058391139327916261 </pre>
 
=={{header|Visual Basic .NET}}==
'''Platform:''' [[.NET]]
===Iterative===
{{works with|Visual Basic .NET|9.0+}}
With Decimal type, maximum value is fibo(139).
<syntaxhighlight lang=vbnet>Function Fib(ByVal n As Integer) As Decimal
Dim fib0, fib1, sum As Decimal
Dim i As Integer
fib0 = 0
fib1 = 1
For i = 1 To n
sum = fib0 + fib1
fib0 = fib1
fib1 = sum
Next
Fib = fib0
End Function</syntaxhighlight>
===Recursive===
{{works with|Visual Basic .NET|9.0+}}
<syntaxhighlight lang=vbnet>Function Seq(ByVal Term As Integer)
If Term < 2 Then Return Term
Return Seq(Term - 1) + Seq(Term - 2)
End Function</syntaxhighlight>
===BigInteger===
There is no real maximum value of BigInterger class, except the memory to store the number.
Within a minute, fibo(2000000) is a number with 417975 digits.
<syntaxhighlight lang=vbnet> Function FiboBig(ByVal n As Integer) As BigInteger
' Fibonacci sequence with BigInteger
Dim fibn2, fibn1, fibn As BigInteger
Dim i As Integer
fibn = 0
fibn2 = 0
fibn1 = 1
If n = 0 Then
Return fibn2
ElseIf n = 1 Then
Return fibn1
ElseIf n >= 2 Then
For i = 2 To n
fibn = fibn2 + fibn1
fibn2 = fibn1
fibn1 = fibn
Next i
Return fibn
End If
Return 0
End Function 'FiboBig
 
Sub fibotest()
Dim i As Integer, s As String
i = 2000000 ' 2 millions
s = FiboBig(i).ToString
Console.WriteLine("fibo(" & i & ")=" & s & " - length=" & Len(s))
End Sub 'fibotest</syntaxhighlight>
 
===BigInteger, speedier method===
 
{{Libheader|System.Numerics}}
This method doesn't need to iterate the entire list, and is much faster. The 2000000 (two millionth) Fibonacci number can be found in a fraction of a second.<br/>Algorithm from [http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html here, see section 3, ''Finding Fibonacci Numbers Fully''.]
<syntaxhighlight lang=vbnet>Imports System
Imports System.Collections.Generic
Imports BI = System.Numerics.BigInteger
 
Module Module1
 
' A sparse array of values calculated along the way
Dim sl As SortedList(Of Integer, BI) = New SortedList(Of Integer, BI)()
 
' Square a BigInteger
Function sqr(ByVal n As BI) As BI
Return n * n
End Function
 
' Helper routine for Fsl(). It adds an entry to the sorted list when necessary
Sub IfNec(n As Integer)
If Not sl.ContainsKey(n) Then sl.Add(n, Fsl(n))
End Sub
 
' This routine is semi-recursive, but doesn't need to evaluate every number up to n.
' Algorithm from here: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#section3
Function Fsl(ByVal n As Integer) As BI
If n < 2 Then Return n
Dim n2 As Integer = n >> 1, pm As Integer = n2 + ((n And 1) << 1) - 1 : IfNec(n2) : IfNec(pm)
Return If(n2 > pm, (2 * sl(pm) + sl(n2)) * sl(n2), sqr(sl(n2)) + sqr(sl(pm)))
End Function
 
' Conventional iteration method (not used here)
Function Fm(ByVal n As BI) As BI
If n < 2 Then Return n
Dim cur As BI = 0, pre As BI = 1
For i As Integer = 0 To n - 1
Dim sum As BI = cur + pre : pre = cur : cur = sum : Next : Return cur
End Function
 
Sub Main()
Dim vlen As Integer, num As Integer = 2_000_000, digs As Integer = 35
Dim sw As System.Diagnostics.Stopwatch = System.Diagnostics.Stopwatch.StartNew()
Dim v As BI = Fsl(num) : sw.[Stop]()
Console.Write("{0:n3} ms to calculate the {1:n0}th Fibonacci number, ", sw.Elapsed.TotalMilliseconds, num)
vlen = CInt(Math.Ceiling(BI.Log10(v))) : Console.WriteLine("number of digits is {0}", vlen)
If vlen < 10000 Then
sw.Restart() : Console.WriteLine(v) : sw.[Stop]()
Console.WriteLine("{0:n3} ms to write it to the console.", sw.Elapsed.TotalMilliseconds)
Else
Console.Write("partial: {0}...{1}", v / BI.Pow(10, vlen - digs), v Mod BI.Pow(10, digs))
End If
End Sub
End Module</syntaxhighlight>
{{out}}
<pre>120.374 ms to calculate the 2,000,000th Fibonacci number, number of digits is 417975
partial: 85312949175076415430516606545038251...91799493108960825129188777803453125</pre>
 
=={{header|Vlang}}==
Update Vlang to version 0.2.2
===Iterative===
<syntaxhighlight lang="go">fn fib_iter(n int) int {
if n < 2 {
return n
Line 13,198 ⟶ 14,695:
 
===Recursive===
<syntaxhighlight lang="go">fn fib_rec(n int) int {
if n < 2 {
return n
Line 13,228 ⟶ 14,725:
 
===Recursive, all at once===
<syntaxhighlight lang="python">def (fib n)
if (n < 2)
n
Line 13,234 ⟶ 14,731:
 
===Recursive, using cases===
<syntaxhighlight lang="python">def (fib n)
(+ (fib n-1) (fib n-2))
 
Line 13,241 ⟶ 14,738:
 
===Recursive, using memoization===
<syntaxhighlight lang="python">def (fib n saved)
# all args in Wart are optional, and we expect callers to not provide `saved`
default saved :to (table 0 0 1 1) # pre-populate base cases
Line 13,251 ⟶ 14,748:
 
===Memoized Recursive===
<syntaxhighlight lang=WDTE"wdte">let memo fib n => n { > 1 => + (fib (- n 1)) (fib (- n 2)) };</syntaxhighlight>
 
===Iterative===
<syntaxhighlight lang=WDTE"wdte">let s => import 'stream';
let a => import 'arrays';
 
Line 13,267 ⟶ 14,764:
=={{header|WebAssembly}}==
 
<syntaxhighlight lang=wat>(func $fibonacci_nth (param $n i32) (result i32)
 
;;Declare some local registers
(local $i i32)
(local $a i32)
(local $b i32)
;;Handle first 2 numbers as special cases
(if (i32.eq (get_local $n) (i32.const 0))
(return (i32.const 0))
)
(if (i32.eq (get_local $n) (i32.const 1))
(return (i32.const 1))
)
;;Initialize first two values
(set_local $i (i32.const 1))
(set_local $a (i32.const 0))
(set_local $b (i32.const 1))
(block
(loop
;;Add two previous numbers and store the result
local.get $a
local.get $b
i32.add
(set_local $a (get_local $b))
set_local $b
;;Increment counter i by one
(set_local $i
(i32.add
(get_local $i)
(i32.const 1)
)
)
;;Check if loop is done
(br_if 1 (i32.ge_u (get_local $i) (get_local $n)))
(br 0)
)
)
;;The result is stored in;;Check b,if soloop push that to theis stackdone
(br_if 1 (i32.ge_u (get_local $i) (get_local $bn)))
(br 0)
)
)
;;The result is stored in b, so push that to the stack
get_local $b
)</syntaxhighlight>
 
=={{header|Whitespace}}==
Line 13,318 ⟶ 14,815:
===Iterative===
This program generates Fibonacci numbers until it is [http://ideone.com/VBDLzk forced to terminate].
<syntaxhighlight lang=Whitespace"whitespace">
 
Line 13,333 ⟶ 14,830:
 
It was generated from the following pseudo-Assembly.
<syntaxhighlight lang="asm">push 0
push 1
 
Line 13,357 ⟶ 14,854:
 
This program takes a number ''n'' on standard input and outputs the ''n''th member of the Fibonacci sequence.
<syntaxhighlight lang=Whitespace"whitespace">
Line 13,386 ⟶ 14,883:
 
</syntaxhighlight>
<syntaxhighlight lang="asm">; Read n.
push 0
dup
Line 13,422 ⟶ 14,919:
=={{header|Wrapl}}==
===Generator===
<syntaxhighlight lang="wrapl">DEF fib() (
VAR seq <- [0, 1]; EVERY SUSP seq:values;
REP SUSP seq:put(seq:pop + seq[1])[-1];
);</syntaxhighlight>
To get the 17th number:
<syntaxhighlight lang="wrapl">16 SKIP fib();</syntaxhighlight>
To get the list of all 17 numbers:
<syntaxhighlight lang="wrapl">ALL 17 OF fib();</syntaxhighlight>
===Iterator===
Using type match signature to ensure integer argument:
<syntaxhighlight lang="wrapl">TO fib(n @ Integer.T) (
VAR seq <- [0, 1];
EVERY 3:to(n) DO seq:put(seq:pop + seq[1]);
Line 13,439 ⟶ 14,936:
 
=={{header|Wren}}==
<syntaxhighlight lang=ecmascript"wren">// iterative (quick)
var fibItr = Fn.new { |n|
if (n < 2) return n
Line 13,470 ⟶ 14,967:
=={{header|x86 Assembly}}==
{{Works with|MASM}}
<syntaxhighlight lang="asm">TITLE i hate visual studio 4 (Fibs.asm)
; __ __/--------\
; >__ \ / | |\
Line 13,524 ⟶ 15,021:
=={{header|xEec}}==
This will display the first 93 numbers of the sequence.
<syntaxhighlight lang=xEec"xeec">
h#1 h#1 h#1 o#
h#10 o$ p
Line 13,537 ⟶ 15,034:
===Analytic===
Uses Binet's method, based on the golden ratio, which almost feels like cheating—but the task specification doesn't require any particular algorithm, and this one is straightforward and fast.
<syntaxhighlight lang="lisp">(DEFUN FIBONACCI (N)
(FLOOR (+ (/ (EXPT (/ (+ (SQRT 5) 1) 2) N) (SQRT 5)) 0.5)))</syntaxhighlight>
To test it, we'll define a <tt>RANGE</tt> function and ask for the first 50 numbers in the sequence:
<syntaxhighlight lang="lisp">(DEFUN RANGE (X Y)
(IF (<= X Y)
(CONS X (RANGE (+ X 1) Y))))
Line 13,550 ⟶ 15,047:
===Tail recursive===
Alternatively, this approach is reasonably efficient:
<syntaxhighlight lang="lisp">(defun fibonacci (x)
(defun fib (a b n)
(if (= n 2)
Line 13,558 ⟶ 15,055:
x
(fib 1 1 x) ) )</syntaxhighlight>
 
=={{header|Xojo}}==
Pass n to this function where n is the desired number of iterations. This example uses the UInt64 datatype which is as unsigned 64 bit integer. As such, it overflows after the 93rd iteration.
<syntaxhighlight lang=vb>Function fibo(n As Integer) As UInt64
 
Dim noOne As UInt64 = 1
Dim noTwo As UInt64 = 1
Dim sum As UInt64
 
For i As Integer = 3 To n
sum = noOne + noTwo
noTwo = noOne
noOne = sum
Next
 
Return noOne
End Function</syntaxhighlight>
 
=={{header|XPL0}}==
<syntaxhighlight lang=XPL0"xpl0">func Fib1(N); \Return Nth Fibonacci number using iteration
int N;
int Fn, F0, F1;
Line 13,608 ⟶ 15,088:
 
=={{header|XQuery}}==
<syntaxhighlight lang="xquery">declare function local:fib($n as xs:integer) as xs:integer {
if($n < 2)
then $n
else local:fib($n - 1) + local:fib($n - 2)
};</syntaxhighlight>
 
 
=={{header|Yabasic}}==
<syntaxhighlight lang=yabasic>sub fibonacci (n)
n1 = 0
n2 = 1
for k = 1 to abs(n)
sum = n1 + n2
n1 = n2
n2 = sum
next k
if n < 0 then
return n1 * ((-1) ^ ((-n) + 1))
else
return n1
end if
end sub</syntaxhighlight>
 
=={{header|Z80 Assembly}}==
<syntaxhighlight lang="z80">; 8 bit version
; IN : a = n (n <= 13, otherwise overflows)
; OUT: a = FIB(n)
Line 13,656 ⟶ 15,119:
Let's go 32 bits...
 
<syntaxhighlight lang="z80">; 32 bit version
; IN : a = n (n <= 47, otherwise overflows)
; OUT: hlh'l' = FIB(n)
Line 13,690 ⟶ 15,153:
exx ; now in reg set
ret</syntaxhighlight>
 
=={{header|YAMLScript}}==
<syntaxhighlight lang="yaml">
!yamlscript/v0
 
defn main(n=10):
loop [a 0, b 1, i 1]:
say: a
if (i < n):
recur: b, (a + b), (i + 1)
</syntaxhighlight>
 
=={{header|zkl}}==
A slight tweak to the task; creates a function that continuously generates fib numbers
<syntaxhighlight lang="zkl">var fibShift=fcn(ab){ab.append(ab.sum()).pop(0)}.fp(L(0,1));</syntaxhighlight>
<pre>
zkl: do(15){ fibShift().print(",") }
Line 13,701 ⟶ 15,175:
610,987,1597,2584,4181,
</pre>
 
=={{header|ZX Spectrum Basic}}==
====Iterative====
<syntaxhighlight lang=zxbasic>10 REM Only positive numbers
20 LET n=10
30 LET n1=0: LET n2=1
40 FOR k=1 TO n
50 LET sum=n1+n2
60 LET n1=n2
70 LET n2=sum
80 NEXT k
90 PRINT n1</syntaxhighlight>
 
====Analytic====
<syntaxhighlight lang=zxbasic>10 DEF FN f(x)=INT (0.5+(((SQR 5+1)/2)^x)/SQR 5)</syntaxhighlight>
 
[[Category:Arithmetic]]