# Fibonacci function or sequence

The Fibonacci sequence is a sequence of numbers, where every number in the sequence is the sum of the two numbers preceding it. The first two numbers in the sequence are both 1.

Here are the first few terms

1 1 2 3 5 8 13 21 34 55 89 ...


Write the shortest code that either:

• Generates the Fibonacci sequence without end.

• Given n calculates the nth term of the sequence. (Either 1 or zero indexed)

You may use standard forms of input and output.

(I gave both options in case one is easier to do in your chosen language than the other.)

For the function that takes an n, a reasonably large return value (the largest Fibonacci number that fits your computer's normal word size, at a minimum) has to be supported.

/* Configuration */

var QUESTION_ID = 85; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 3; // This should be the user ID of the challenge author.

/* App */

return "https://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(a) {
});
comment_page = 1;
}
});
}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
});
else process();
}
});
}

var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

function getAuthorName(a) {
return a.owner.display_name;
}

function process() {
var valid = [];

var body = a.body;
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});

var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
});
else console.log(body);
});

valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});

var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;

.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)

var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();

languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});

var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);

langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});

for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
language = jQuery(language);
jQuery("#languages").append(language);
}

}
body {
text-align: left !important;
display: block !important;
}

width: 290px;
float: left;
}

#language-list {
width: 290px;
float: left;
}

font-weight: bold;
}

table td {
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<tr><td>Language</td><td>User</td><td>Score</td></tr>
<tbody id="languages">

</tbody>
</table>
</div>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>

</tbody>
</table>
</div>
<table style="display: none">
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
</tbody>
</table>

# Alchemist, 68 bytes

y+_->y+a+b
y+0_->z
z+a->z+_
z+0a->x
x+b->x+a
x+0b->y+Out_a+Out_" "!y


Try it online!

Outputs the 1-based sequence infinitely, If you want 0-based (i.e. 0 1 1 2 3 5...), you can change the trailing y to either x or z.

### Explanation:

!y              # Initialise the program with the y flag alongside the default _

y+_->y+a+b      # Convert all _ atoms to a and b atoms
y+0_->z         # Once we're out of _ atoms, change to the z flag

z+a->z+_        # Convert the a atoms back to _ atoms
z+0a->x         # Switch to the x flag

x+b->x+a        # Convert all b atoms to a atoms
x+0b->y         # Once we're out, change to y flag
+Out_a   # Print the number of a atoms
+Out_" " # And a separator


If it makes you feel better, here's a more pseudo-codey version:

_=1
while true:
a=a+_
b=_
_=a
a=b
print a


# Pyramid Scheme, 385 bytes

   ^           ^
/ \         /l\
/set\       /oop\
^-----^     ^-----^
-    ^-    /]\   ^-^
^-    ^---^ ^- -^
^-    ^-   -/ \  -^
^-     -^   /set\  -^
/[\     / \ ^-----^  -^
^---^   /out\-    ^-  / \
-^  -^ ^-----^   /+\ /set\
/1\ / \-    /x\ ^---^-----^
---/set\    --- -  /x\   /+\
^-----^          ---  ^---^
/x\   /1\             /x\  -
---   ---             ---


Try it online!

This guy's a whopper. Prints terms indefinitely with no separator. The bit on the left initializes the blank variable and x to one, and the bit on the right does the Fibonaccing. The loop condition (everything to the left below loop) prints both variables before checking the blank one for truthiness (it'll always be nonzero). The loop body updates first blank and then x, thus generating the next two terms for the condition to print.

I can't quite figure out set. It doesn't quite follow the chain of execution, but it almost does, I think. I'll be looking at the Pyramid Scheme source in the next few days (and possibly extending the language); perhaps this will provide me with the insight required to golf some bytes off this monstrosity.

# pure bash, 43 chars

for((r=l=i=1;i++<40;l+=r+=l)){ echo $r$l;}


Not really golfed, but I like it anyway.

Or

r=1 l=0;echo {,,}{,,}{,,}\ $[r+=l]\$[l+=r]


# Zsh, 31 bytes

try it online

for ((a=1;b+=a;a+=b))echo $a$b


32 bytes, based on James Brown's awk solution:
for ((y=1;z=x+y;y=z))echo $[x=y] 42 bytes, to halt before int overflow: (for ((a=1;b+=a;a+=b))echo$a $b)|head -46 NB: For a properly "endless" solution I need logic for long long (..) long integers, per this post # Cascade, 28 25 bytes ?01 ^/ |.# !9] -0 !0] +1  Try it online! Outputs the Fibonacci numbers separated by tabs starting from 1. This shows off the behaviour of variables in Cascade, in that the variables 1 and 0 aren't static in this program. Unfolded, this looks something like:  @ ^ ^ \ / . | # 9 | ] | 0 - | ] 0 | 1 + / 1 0 / |  Try it online! This initially branches twice, with the leftmost going down the tree until it sets ([) the variable 1 to the sum (+) of 1 and 0. Then it sets 0 to that value to the result of that minus 0. This has the effect of advancing one element in the Fibonacci sequence.For example, the values of repeated executions are: 0 1 1 1 1 2 2 3 3 5 5 8 8 13 ...  Finally it prints the total result of that, which is the new value of 0. The next branch prints the tab separator (.9), and the final branch loops back around to the top of the program. ## Bash 100 This is a very slow, but hey no performance penalty. First line needed. #!/bin/bash if [$1 -lt 2 ]; then
echo $1; exit; fi expr $0 \expr $1 - 1\ + $0 \expr $1 - 2\  • More a question: You don't need a shebang, do you? See ruby, python and xy-script. – user unknown Apr 12 '11 at 1:39 • (($1<2))&& echo $1 && exit;v=$1;p=$0;echo$(($($p $((v-1)))+$($p$((v-2))))) 77 chars with the same approach, just different syntax and a bit faster – user unknown Apr 12 '11 at 1:50
• I see the white space surrounding the brackets and instinctively click the "comment" button to tell you it should be removed... then I remember this is bash – Cyoce Mar 25 '16 at 6:05
• There is redundant whitespace here, after each semicolon. – Peter Cordes Dec 7 '16 at 15:04
• solution fails on TIO.run , and so does the version in comments. – roblogic Aug 28 '19 at 9:20

## Scala, 52 chars:

def f(a:Int,b:Int):Int={println(a);f(b,a+b)};f(0,1)


CHIP 8

Not so short but displays the fibonacci sequence on screen:

00E06600690060006101221E3900120E8200801081206F00810489F0120A6500830064F083428336833683368336F32900E0D56575088300640F8342F329D56500EE


without displaying on screen:

00E06000610182008010812081041206


Clojure: 38 chars

    (def f(lazy-cat[0 1](map +(rest f)f)))


run with:

    f


# Javascript - 48 chars

for(i=1;i<n;i++){f[i]=f[i-1]+(f[i-2]?f[i-2]:0);}


Clean and simple... probably not a shortness winner :D

Here is the full implementation:

function a(n) {
var i;
var f = new Array();
f[0]=1;

for(i=1;i<n;i++){f[i]=f[i-1]+(f[i-2]?f[i-2]:0);}

console.log(f);
}


# APL: 26 characters

This is a function which will print out the n and n-1 Fibonacci numbers:

{({⍵+.×2 2⍴1 1 1 0}⍣⍵)0 1}


For example,

{({⍵+.×2 2⍴1 1 1 0}⍣⍵)0 1}13


yields the vector:

233 144

• Surely, with APL's prodigious operator vocabulary, it should be able to compete in size with the GolfScript one? ;-) – Chris Jester-Young Apr 8 '13 at 11:32
• @ChrisJester-Young Oh probably, but I only started learning APL today... – SL2 Apr 8 '13 at 23:41

## C, 45 (37)

Only because it's easy:

f(n){return n<2?n?1:0:f(n-1)+f(n-2);}


Or the more compiler-friendly/standards-compliant but more verbose version:

#define m main(n
m){return n<2?n?1:0:m-1)+m-2);}


note: once compiled, you have to call main() with an actual value (which will likely take some command line fiddling depending on OS)

• Doesn't run for me. – Johannes Kuhn Nov 28 '13 at 22:53
• It only runs as a stand-alone in some environments with very specific settings. I'll add a friendlier version though. – Stuntddude Nov 28 '13 at 23:48
• Number of arguments could work. Intresting way to pass the parameter. – Johannes Kuhn Nov 29 '13 at 7:15
• n?1:0 can be replaced with just n. – Cyoce May 2 '16 at 15:23

### Befunge, 15 13 characters

1:.:00p+00g\#


I didn't spot any Befunge solutions, so I thought I'd write one. Too bad Befunge doesn't have a rotate-n operation, and trampoline # doesn't work at end-of-line to skip first character after looping around. Turns out that part of the spec is considered ambiguous on that point, and my initial interpretation is actually valid.

# Befunge 98, 10 characters

1:"]"y+#


8-character code generating the fibonacci sequence on the stack, under the assumption that # should first wrap around then skip, which sadly does not hold in CCBI (where I run my Befunge code). It would work if we restricted the fungespace X dimension to 8 cells.

1#;:"]"y+;


Using 10 characters, the code actually works in CCBI, generating the sequence on the stack.

1#;:.:"]"y+;


With 12 characters, we have working code that outputs space-delimited numbers to stdout (would be 10 chars if based on the first version).

1#;:.:"]"y+:02*k#@;


This 20-character version ends the loop as soon as overflow occurs (on 32bit system, it delivers the sequence up to 1836311903). If you add 2 more characters, each number is on a separate line (insert a, after :.)

All these versions operate purely on the stack, no modification of fungespace cells. The 'printing' versions do so in addition to generating the sequence on the stack.

## Breakdown:

1. 1 pushes 1 on the empty stack.
2. # skips the next fungespace cell (;).
3. :. duplicates, pops and prints the top-of-stack value (1 in the first iteration). Inserting a, here outputs an ASCII 10 character, which makes a new line.
4. : duplicates again. (Stack now [1 1])
5. "]" pushes 93 (ASCII). This is explained further below. (Stack now [1 1 93])
6. y pops a value and pushes system information for it. In our case, that's the third-of-top value on the stack. In the first iteration, this is 0, as there are only two elements there. (Stack now [1 1 0])
7. + pops two values and pushes their sum. (Stack now [1 1])
8. :0' compares the TOS value with 0 and pushes 1 if it was greater, else 0. (It should be a backtick.) (Stack now [1 1 1])
9. 2*k# pops and doubles our comparison result, and performs the # that many times (0 or 2). While the numbers are positive, it skips to the ;, otherwise to the @ (because k automatically moves the IP beyond its target with a 0 argument). (Stack now [1 1])
10. @ terminates the program. It is only reached when overflow occurred.
11. ; creates kind of a wormhole. It skips everything until it encounters another ;, which it will at the third character of the line. Execution continues with step 3.)

In step 5.), I use 93 as an argument to y. This value is individual, because y outputs things like the command line arguments and environment variables, and starts returning values from the stack (top-down) if its argument is greater than the size of actual system information y emits. If eg. you rename the script to a different length name, you have to adjust this value.

To find the correct value, you can insert 01-y (which pushes ALL system information) at the beginning, start in the debugger (-t switch for CCBI), step 4, see how big your stack is, add 3, and replace ] with the resulting character.

Note that the use of y may cause CCBI to report an Access violation on @ which can be safely ignored, as is the case on my system (Win8.1/64, ccbi.exe/32). The short versions keep on looping into eternity (given infinite memory).

PS: If we move the :. between the y and +, the printed sequence becomes 0 1 1 2 ... If we want it starting with 0 on the stack, we simply insert 0 at the beginning (and leave :. where it is now).

# Ruby, 27

p a=b=1;loop{a,b=(p b),a+b}


Prints each number, starting correctly with the first two 1s, to STDOUT ad infinitum (VERY QUICKLY from irb in my environment - you've been warned). I've been learning Ruby lately, so I figured I'd contribute this. If it can be shortened in any way, let me know.

# Julia - 20 Characters

f=n->([1 1;1 0]^n)[]


I used the same basic algorithm as the Octave answer. This starts with f(0)->1, f(1)->1, to avoid needing an explicit array index. This is 4 characters shorter than the naive recursive algorithm.

f=n->n<2?1:f(n-1)+f(n-2)


# Python 3, 39 38 bytes

a=1
b=1
while 1:c=a+b;print(c);a=c;b=c


Ungolfed:

a = 1
b = 1
while 1:
c = a + b
print(c)
a = c
b = c


Is there some way of getting rid of the b=c statement?

• Welcome to PPCG! Does a=b=c work in Python? (Same for a=b=1.) Also, do you really need the space after :? – Martin Ender Oct 12 '15 at 13:26
• @MartinBüttner It did print the Fibonnaci sequence, and it also showed a weird wavy "animation" :P – m654 Oct 12 '15 at 14:07
• @MartinBüttner Assignments can be chained, just like comparisons, but they don't return a value so you can't do a=1+(b=c). – lirtosiast Oct 12 '15 at 14:13
• This doesn't print the right sequence. It's not hard to fix though. – Ørjan Johansen Jan 31 '19 at 23:03

# Rust, 44 bytes

fn f(n:u8)->u8{if n<2{n}else{f(n-1)+f(n-2)}}


## dc, 29 chars

1ddppsa[+sblalbsalbplxx]sxlxx

• Verified. how the $^*# does that work?? – roblogic Aug 28 '19 at 9:04 # Vitsy, 11 Bytes I'm certain there's a way to shorten these. Print out all fibonacci (to Integer.MAX_VALUE) 01[D}+DNaO] 01 Push 0 and 1 to the stack. [ ] Repeat infinitely. D Duplicate the top item of the stack. } Rotate the stack to right. + Add the top two items. D Duplicate the top item. N Print the top item out as a number. aO Print a return.  Print out to input fibonacci (13 bytes): 01}\[D}+DNaO] 01 Push 0 and 1 to the stack. }\[ ] Get the input and repeat that many times. D Duplicate the top item of the stack. } Rotate the stack to right. + Add the top two items. D Duplicate the top item. N Print the top item out as a number. aO Print a return.  ## Minkolang 0.10, 10 bytes This language was created after this challenge but not for it. Stream (link, do not click "Run"): 01d1R+dN2@  A mite clever, if I do think so. The 2@ at the end is a 2-trampoline that jumps over the 01 at the beginning, allowing the sequence to rise unabated. Nth Fibonacci (link): 01nd,7&[d1R+]rN.  Worse than I expected, 16 bytes. 01 sets it up, nd,7&...N. prints out 0 if the input is 0 and does the loop otherwise. [d1R+] builds up the sequence, then r reverses the stack and the correct number is outputted and the program ends with N.. • Grar! Again? You beat me by one again. grumble – Addison Crump Oct 30 '15 at 20:26 • .... ¯\_(ツ)_/¯ – El'endia Starman Oct 30 '15 at 20:38 # Turing machine code, 389 I wrote this the other day and decided to post it. Generates an infinite Fibonacci sequence in unary on the tape. See a commented version in action here. 0 _ 1 r 1 1 _ _ r 2 2 _ 0 r 3 3 _ _ r 4 4 _ 0 l 5 5 0 * l 5 5 _ * l 5 5 1 * r f a 0 1 r b b 0 * r b b _ * r c c 0 * r c c _ * r d d _ 0 l e e 0 * l e e _ * l e e 1 * r f f 0 1 r g f _ * r k g 0 * r g g _ * r h h 0 * r h h _ * r i i 0 * r i i _ 0 l j j 0 * l j j _ * l j j 1 * r f k 0 1 r l k _ * l R l 0 * r l l _ * r m m 0 * r m m _ 0 l n n 0 * l n n _ * l n n 1 * r k R _ * r a R 1 0 l R  # ShapeScript, 16 14 bytes _1@0@'@1?+'*!#  This reads an integer n (in unary) from STDIN and prints the nth Fibonacci number. The submission is non-competing, since this challenge predates ShapeScript's creation by a few years. Try it online! ### How it works  Input: a string of n 1's _ Get the length of the input to push n. 1@ Swap it with 1 (F[-1]). 0@ Swap it with 0 (F[0]). STACK: F[-1] F[0] n ' Push a string that, when evaluated for the i-th time, does the following: @ Swap F[i-2] on top of F[i-1]. 1? Push a copy of F[i-1]. + Add the copy of F[i+1] to F[i]. ' STACK: F[i-1] F[i] *! Repeat the string n times and evaluate it. # Discard F[n] from the stack.  # Brainf*ck, 489 466 characters Granted, this is a bit overkill, not to mention that it could be optimised a lot. I will get to improving it tomorrow, since it's too late today. EDIT: Improved by a few bytes by putting stuff closer together on the tape. ++++++>++++++++++>+>>>>>>>>>+<<<<<<<<<<<[->>[>>+>+<<<-]>>>[<<<+> >>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]+++++ +++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[->>++++++++[<++++++>-]]<[ .[-]<]>>>>>>>>[->+<<<<<<<<<<+>>>>>>>>>]>[-<+>]<<<<<<<<<<<.>>>>>> >>>>[>>+>+<<<-]>>>[<<<+>>>-]<<+>[<->[>++++++++++<[->-[>+>>]>[+[- <+>]>+>>]<<<<<]>[-]++++++++[<++++++>-]>[<<+>>-]>[<<+>>-]<<]>]<[- >>++++++++[<++++++>-]]<[.[-]<]<<<<<<<<<<[->+>>>>>>>>+<<<<<<<<<]> [-<+>]<<.<]  (With added newlines for readability) # Oration, 135 bytes I believe that this is "optimal"... takes a deep breath here we go! Inhale Start a function f with n If n<2 Return n Backtracking Inhale Here Literally, f(n-2)+f(n-1) I'm done Listen Invoke f with number  The little ~> is input. This outputs the (input)th Fibonacci number. This transpiles to (in Python): def f(n): if n<2: return n return f(n-2)+f(n-1) print(f(eval(input("~>"))))  • Why is the transpiled Python code not golfed D: – Downgoat Feb 2 '16 at 4:01 # Oracle SQL 9.2, 80 bytes SELECT ROUND(POWER((1+SQRT(5))/2,LEVEL-1)/SQRT(5))FROM DUAL CONNECT BY LEVEL<:1;  # Lua, 51 bytes function f(n) return n<2 and n or f(n-1)+f(n-2)end It creates a function called f(n), that takes an input (n). If n = 1, returns n. This function uses recursion. # beeswax, 12 bytes (sequence), 42 bytes (n-th Fib.) Beeswax is newer than the question, so no competition here. Fibonacci sequence. p{N<P{* >~+d  No promotion to higher bit widths implemented in my solution, so 64-bit overflow starts at the 93rd or 92nd Fibonacci number, depending if you start counting your sequence at 0 or 1: 0 1 1 2 3 5 8 13 21 34 55 89 . . . 4660046610375530309 7540113804746346429 12200160415121876738 ← 93rd Fibonacci number 1293530146158671551 ← 1st. 64-bit overflow/wraparound 13493690561280548289  N-th Fibonacci number: ;{#'<>~P~L#MM@>+@'p@{; _TNX~P~K#{; d~@M<  The same limit applies to this solution. # CJam, noncompeting, 11 bytes 0X{_@+}q~*;  • F(0) = 0. You should eliminate the backslash. – Dennis Mar 2 '16 at 15:40 • Ah I was assuming that we were starting from 1,1..... so I guess this is a good convention since it saves a byte :) – A Simmons Mar 2 '16 at 16:18 • People start the Fibonacci sequence at different values, so F(0) = 0 may or may not be defined. However, when it comes to indexing, F(1), F(2) = 1, since a lot of the sequence's properties depend on that. – Dennis Mar 2 '16 at 16:29 # DUP, 10 bytes 1$[^^+2!]!


Try it here.

An infinite stream that leaves results on stack. Use the Step button to avoid setting off the infinite loop.

# Explanation

1\$         {start w/ 2 1's}
[     ]! {execute lambda}
^^      {take top 2 items on stack}
`