[Question]
  [
Given *N* (2 <= *N*), print *N* lines of the letter Fibonacci series like this (i.e. *N* = 5)
First, start with `a` and `b`:
```
a
b
```
Next, add the two lines.
```
a
b
ab
```
Keep adding the last two lines.
```
a
b
ab
bab
```
Keep going...
```
a
b
ab
bab
abbab
```
And we're done.
Remember, this is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'"), so the code with the fewest bytes wins.
  
[Answer]
# Python 2, 41 bytes
*Saved 3 bytes thanks to @xnor*
```
a,b="ab";exec"print a;a,b=b,a+b;"*input()
```
[Test on Ideone](http://ideone.com/zeXj9d)
Simply follows the recursive definition.
[Answer]
## Haskell, ~~29~~ ~~35~~ 32 bytes
```
a%b=a:b%(a++b)
(`take`("a"%"b"))
```
Simple recursion.
For reference: the old version (an adaption of [this answer](https://codegolf.stackexchange.com/a/86961/34531)), 
concatenated the strings in the wrong order, so I had to add a `flip(...)` which made it too long (35 bytes). 
```
f="a":scanl(flip(++))"b"f
(`take`f)
```
[Answer]
# [05AB1E](http://github.com/Adriandmen/05AB1E), ~~12~~ 11 bytes
Thanks to *Emigna* for saving a byte!
```
'a='b¹GD=Š«
```
Uses the **CP-1252** encoding. [Try it online!](http://05ab1e.tryitonline.net/#code=J2E9J2LCuUdEPcWgwqs&input=OQ)
[Answer]
# [Jelly](https://github.com/DennisMitchell/jelly), ~~11~~ 10 [bytes](https://github.com/DennisMitchell/jelly/wiki/Code-page)
```
”a”bṄ;¥@¡f
```
[Try it online!](http://jelly.tryitonline.net/#code=4oCdYeKAnWLhuYQ7wqVAwqFm&input=&args=NQ)
### How it works
```
”a”bṄ;¥@¡f  Main link. Argument: n
”a          Set the return value to 'a'.
  ”b    ¡   Call the link to the left n times, with left argument 'b' and right
            argument 'a'. After each call, the right argument is replaced with the
            left one, and the left argument with the return value. The final
            return value is yielded by the quicklink.
      ¥       Combine the two atoms to the left into a dyadic chain.
    Ṅ           Print the left argument of the chain, followed by a linefeed.
     ;          Concatenate the left and right argument of the chain.
       @      Call the chain with reversed argument order.
         f  Filter the result by presence in n. This yields an empty string
            and thus suppresses the implicit output.
```
[Answer]
# Java 7, 69 bytes
```
String c(int n,String a,String b){return n--<1?"":a+"\n"+c(n,b,a+b);}
```
### ungolfed
```
 class fibb {
public static void main(String[] args) {
    System.out.println( c( 7, "a" , "b" ) );
}
static String c(int n,String a,String b) {
    
    return n-- < 1  ? "" : a + "\n" + c(n,b,a + b);
    
}
}
```
[Answer]
# Emacs, ~~26~~, 25-ish keystrokes
### Program
`#n` to be read as key with digit(s) *n*:
`A``RET``B``RET``F3``UP``UP``C-SPACE``C-E``M-W``DOWN``DOWN``C-Y`
`UP``C-A``C-SPACE``C-E``M-W``DOWN``C-E``C-Y``RET``F4``C-#(n-2)``F4`
## Explanation
```
command(s)               explanation                      buffer reads (| = cursor aka point)
-----------------------------------------------------------------------------------------------
A<RET> B<RET>            input starting points            "a\nb\n|"
<F3>                     start new macro                  "a\nb\n|"
<UP><UP>                 move point two lines up          "|a\nb\n"
C-<SPACE> C-E M-W        copy line at point               "a|\nb\n"
<DOWN><DOWN>             move point two lines down        "a\nb\n|"
C-Y                      yank (paste)                     "a\nb\na|"
<UP>                     move point one line up           "a\nb|\na"
C-A C-<SPACE> C-E M-W    copy line at point               "a\nb|\na"
<DOWN>                   move point one line down         "a\nb|\na|"
C-E C-Y <RET>            yank (paste) and add new line    "a\nb|\nab\n|"
<F4>                     stop macro recording             "a\nb|\nab\n|"
C-#(n-3) <F4>            apply macro n-3 times            "a\nb|\nab\nbab\nabbab\n|"
```
## With n=10
```
a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab
```
[Answer]
# JavaScript (ES6), ~~43~~ 42 bytes
*Saved a byte thanks to @Arnauld*
```
f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)
```
[Answer]
# CJam, ~~19~~ 17 bytes
```
'a'b{_@_n\+}ri*;;
```
explanation
```
"a": Push character literal "a" onto the stack.
"b": Push character literal "b" onto the stack.
{_@_p\+}
    {: Block begin.
    _: duplicate top element on the stack
    @: rotate top 3 elements on the stack
    _: duplicate top element on the stack
    n: print string representation
    \: swap top 2 elements on the stack
    +: add, concat
    }: Block end.
r: read token (whitespace-separated)
i: convert to integer
*: multiply, join, repeat, fold (reduce)
;: pop and discard
;: pop and discard
```
[Answer]
# [V](http://github.com/DJMcMayhem/V), 18 bytes
```
ia
bkÀñyjGpgJkñdj
```
[Try it online!](http://v.tryitonline.net/#code=aWEKYhtrw4DDsXlqR3BnSmvDsWRq&input=&args=Nw)
Or, the more readable version:
```
ia
b<esc>kÀñyjGpgJkñdj
```
Explanation:
```
ia
b<esc>          " Insert the starting text and escape back to normal mode
k               " Move up a line
 Àñ       ñ     " Arg1 times:
   yj           "   Yank the current line and the line below
     G          "   Move to the end of the buffer
      p         "   Paste what we just yanked
       gJ       "   Join these two lines
         k      "   Move up one line
           dj   " Delete the last two lines
```
[Answer]
# [MATL](http://github.com/lmendo/MATL), 14 bytes
```
97c98ci2-:"yyh
```
[Try it online!](http://matl.tryitonline.net/#code=OTdjOThjaTItOiJ5eWg&input=NQ)
```
97c     % Push 'a'
98c     % Push 'b'
i2-     % Input number. Subtract 2
:"      % Repeat that many times
  yy    %   Duplicate the top two elements
  h     %   Concatenate them
```
[Answer]
# Python 2, 55 bytes
```
def f(n):m='a','b';exec'print m[-2];m+=m[-2]+m[-1],;'*n
```
[Answer]
## [Retina](http://github.com/mbuettner/retina), 33 bytes
```
.+
$*
^11
a¶b
+`¶(.+?)1
¶$1¶$%`$1
```
[Try it online!](http://retina.tryitonline.net/#code=LisKJCoKXjExCmHCtmIKK2DCtiguKz8pMQrCtiQxwrYkJWAkMQ&input=NQ)
Saved 10 (!) bytes thanks to @[MartinEnder](https://codegolf.stackexchange.com/users/8478/martin-ender)!
### Explanation
Converts the input to unary, subtracts `2` and adds the `a` and the `b`, then recursively replaces the remaining `1`s with the concatenation of the two previous strings.
[Answer]
## Batch, ~~102~~ 93 bytes
```
@set a=a
@set b=b
@for /l %%i in (2,1,%1)do @call:l
:l
@echo %a%
@set a=%b%&set b=%a%%b%
```
Fortunately variables are expanded for every line before assignments take effect, so I can set both `a` and `b` using their old values without needing a temporary. Edit: Saved 9 bytes thanks to @nephi12.
[Answer]
# Stack my Golf, 63 bytes
Get my language here: <https://github.com/cheertarts/Stack-My-Golf>.
```
($1=(_(a))($2=(_(b))($2-f:1-f,)?)?)f\($1=(f)($1-p(\n),:f,)?)p\p
```
There is probably a shorter way but this is the most obvious.
[Answer]
# Perl, ~~36~~ 35 bytes
Includes +3 for `-n`
Give count on STDIN
```
perl -M5.010 fibo.pl <<< 5
```
`fibo.pl`
```
#!/usr/bin/perl -n
$_=$'.s/1//.$_,say$`for(a1.b)x$_
```
[Answer]
# Perl, 45 +1 = 46 bytes
+1 byte for -n flag
```
$a=a,$b=b;say($a),($a,$b)=($b,$a.$b)for 1..$_
```
Slight improvement over the existing 49-byte solution, but developed separately. The parentheses for `say($a)` are necessary because otherwise, it interprets `$a,($a,$b)=($b,$a.$b)` as the argument of `say` which outputs more junk than we need.
# Perl, 42 bytes
```
$b=<>;$_=a;say,y/ab/bc/,s/c/ab/g while$b--
```
A separate approach from the above solution:
```
$b=<>;                                       #Read the input into $b
      $_=a;                                  #Create the initial string 'a' stored in $_
           say                               #Print $_ on a new line
               y/ab/bc/                      #Perform a transliteration on $_ as follows:
                                   #Replace 'a' with 'b' and 'b' with 'c' everywhere in $_
                        s/c/ab/g             #Perform a replacement on $_ as follows:
                                   #Replace 'c' with 'ab' everywhere in $_
              ,        ,         while$b--   #Perform the operations separated by commas
                                   #iteratively as long as $b-- remains truthy
```
I'm not yet convinced I can't combine the transliteration and replacement into a single, shorter operation. If I find one, I'll post it.
[Answer]
# [SOML](https://github.com/dzaima/SOML), 8 bytes
```
 a b.{;t⁴+
```
explanation:
```
 a b.{;t⁴+                                        stack on 1st cycle
 a              push "a"                               ["a"]
   b            push "b"                               ["a","b"]
    .{          repeat input times                     ["a","b"]
      ;         swap the two top things on the stack   ["b","a"]
       t        output the top thing on the stack      ["b","a"]
        ⁴       copy the 2nd from top thing from stack ["b","a","b"]
         +      join them together                     ["b","ab"]
```
This language is still in development and I did add a couple new functions while writing this.
Also, 1st post on PPCG!
[Answer]
# Swift 3, 76 Bytes
```
func f(_ n:Int,_ x:String="a",_ y:String="b"){if n>1{print(x);f(n-1,y,x+y)}}
```
[Answer]
## Perl, 48 bytes
**47 bytes code + 1 for `-n`.**
Simple approach. Try using an array slice originally `$a[@a]="@a[-2,-1]"` but that necessitates `$"=""` or similar :(. Save 1 byte thanks to @[Dada](https://codegolf.stackexchange.com/users/55508/dada)!
```
@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@
```
### Usage
```
perl -nE '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5
a
b
ab
bab
abbab
```
[Answer]
# 05AB1E, 15 bytes
```
'a'bVUFX,XYUYJV
```
[Answer]
# **C**, 156 bytes (without indent)
```
void f(int n)
{
    char u[999]="a",v[999]="b",*a=u,*b=a+1,*c=v,*d=c+1,*e,i;
    for(i=0;i<n;++i)
    {
        printf("%s\n",a);
        for(e=c;*b++=*e++;);
        e=a;a=c;c=e;e=b+1;b=d;d=e;
    }
}
```
Two buffers (u & v) store the last two lines. The newest line (tracked with two pointers: start=c, end=d) is appended to the oldest one (start=a, end=b). Swap (a,b) and (c,d), and loop. Pay attention to buffer size before requesting too much lines.
Not so short (as expected of a low-level language), but was fun to code.
[Answer]
# PHP, ~~63~~ 62 bytes
Recursive version:
```
function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}
```
[Answer]
# [Python 2](https://docs.python.org/2/), 56 bytes
```
a,b="ab"
for i in range(input()):
	print(a+b)
	a,b=b,a+b
```
[Try it online!](https://tio.run/##K6gsycjPM/r/P1EnyVYpMUmJKy2/SCFTITNPoSgxLz1VIzOvoLREQ1PTiouzoCgzr0QjUTtJk4sTpDxJB8j@/98UAA "Python 2 – Try It Online")
# [Python 2](https://docs.python.org/2/), 44 bytes
```
a,b="ab"
exec"print(a+b);a,b=b,a+b;"*input()
```
[Try it online!](https://tio.run/##K6gsycjPM/r/P1EnyVYpMUmJK7UiNVmpoCgzr0QjUTtJ0xokkaQDZForaWXmFZSWaGj@/28KAA "Python 2 – Try It Online")
[Answer]
# [Pyth](http://github.com/isaacg1/pyth), 17 bytes
```
J,\a\bjP.U=+Js>2J
```
A program that takes input of an integer and prints the result.
[Try it online!](http://pyth.tryitonline.net/#code=SixcYVxialAuVT0rSnM-Mko&input=MTA)
**How it works**
```
J,\a\bjP.U=+Js>2J  Program. Input: Q
 ,\a\b             Yield the two element list ['a', 'b']
J                  Assign to J
        .U         Reduce over [0, 1, 2, 3, ..., Q] (implicit input):
          =J+        J = J +
              >2J     the last two elements of J
             s        concatenated
       P           All of that except the last element
      j            Join on newlines
                   Implicitly print
```
[Answer]
# Pyth - ~~16~~ 15 bytes
```
A"ab" m=H+
~GHH
```
[Try it online here](http://pyth.herokuapp.com/?code=A%22ab%22+m%3DH%2B%0A%7EGHH&input=5&debug=0).
[Answer]
# APL, 30 bytes.
`⎕IO` must be `1`.
```
{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳
```
[Answer]
# Mathematica, 49 bytes
```
f@1="a";f@2="b";f@n_:=f[n-2]<>f[n-1];g=f~Array~#&
```
Defines a function `g` taking the single numerical input; returns a list of strings. Straightforward recursive implementation, using the string-joining operator `<>`.
# Mathematica, 56 bytes
```
NestList[#~StringReplace~{"a"->"b","b"->"ab"}&,"a",#-1]&
```
Unnamed function, same input/output format as above. This solution uses an alternate way to generate the strings: each string in the list is the result of simultaneously replacing, in the previous string, all occurrences of "a" with "b" and all occurrences of "b" with "ab".
[Answer]
# Groovy, 79 Bytes
```
{println("a\nb");x=['a','b'];(it-2).times{println(y=x.sum());x[0]=x[1];x[1]=y}}
```
[Answer]
# PHP, 53 bytes
```
for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';
```
[Answer]
# C++11, ~~89~~ 98 bytes
+7 bytes for *all* lines, not only the last one. +2 bytes more for `N` being the number of lines printed, not some 0-based stuff.
```
#include<string>
using S=std::string;S f(int n,S a="a",S b="b"){return n-1?a+"\n"+f(n-1,b,a+b):a;}
```
Usage:
```
f(5)
```
]