# Fibonacci numbers - newbie question

**URL:** <https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959>\
**Category:** Ruby\
**Created:** [July 12, 2009, 11:23am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959 "2009-07-12T11:23:40Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 12, 2009, 11:23am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/1 "2009-07-12T11:23:40Z")

</div>

Dear All,

I have two Fibonacci method, and I got different result.

What wrong in my code.?

def fib(n)  
if n \< 2  
1  
else  
fib(n-2) + fib(n-1)  
end  
end

puts fib(10) # —\> 89

def fib1(x)  
return x if x \< 2  
return fib1(x- 1) + fib1(x - 2)  
end

puts fib1(10) # --\> 55

regards,  
salai.

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 12, 2009, 11:39am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/2 "2009-07-12T11:39:26Z")

</div>

salai wrote:

> ```
> fib(n-2) + fib(n-1)
> 
> ```
> 
> puts fib1(10) # --\> 55
> 
> regards,  
> salai

Notice the difference between the two when x is 0.

-Justin

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 12, 2009, 11:41am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/3 "2009-07-12T11:41:12Z")

</div>

On Sunday 12 July 2009, salai wrote:

> | fib(n-2) + fib(n-1)  
> |  
> |  
> |  
> |puts fib1(10) # --\> 55  
> |  
> |  
> |regards,  
> |salai.

In the first case, if the number is less than 2, you always return 1. In  
the  
second case, you return the number itself (that is, 1 if x is 1 and 0 if  
x is  
0).

Stefano

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 12, 2009, 7:15pm UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/4 "2009-07-12T19:15:43Z")

</div>

On Jul 12, 5:40 am, Stefano C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > |def fib(n)  
> > |def fib1(x)  
> > |salai.
> 
> In the first case, if the number is less than 2, you always return 1. In the  
> second case, you return the number itself (that is, 1 if x is 1 and 0 if x is  
> 0).
> 
> Stefano

Many people forget (or don’t know) the series starts:

Fib(0)=0  
Fib(1)=1  
Fib(2)=1  
…  
So when x \< 2 then Fib=x  
These initial conditions are important for doing algebraic forms for  
the series.

And actually, the full series can be extended into negative numbers.  
See at url: [Fibonacci sequence - Wikipedia](http://en.wikipedia.org/wiki/Fibonacci_number)

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 12, 2009, 7:54pm UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/5 "2009-07-12T19:54:53Z")

</div>

2009/7/12 jzakiya [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> And actually, the full series can be extended into negative numbers.  
> See at url: [http://en.wikipedia.org/wik](http://en.wikipedia.org/wik)

Indeed, but salai’s problem is still that. For him, in one method F(0)  
= 1 and on the other method F(0) = 0.

Cheers,

Serabe

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 13, 2009, 12:17am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/6 "2009-07-13T00:17:11Z")

</div>

On Sun, Jul 12, 2009 at 12:15 PM, jzakiya[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > |  
> > > |  
> > > |regards,  
> > > Fib(0)=0  
> > > Fib(1)=1  
> > > Fib(2)=1  
> > > …  
> > > So when x \< 2 then Fib=x  
> > > These initial conditions are important for doing algebraic forms for  
> > > the series.

The first time I saw this problem, I did the recursive thing, but I  
just _had_ to use #inject, so for a full list…

n = 10  
(0…n-1).inject([0,1]) {|a, i| a.push(a[-2] + a[-1])}

Of course if you only want the nth number you can #shift inside the  
#inject, and always keep the array size 2.

Todd

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 13, 2009, 6:21pm UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/7 "2009-07-13T18:21:06Z")

</div>

Todd B. wrote:

> The first time I saw this problem, I did the recursive thing, but I  
> just _had_ to use #inject, so for a full list…
> 
> n = 10  
> (0…n-1).inject([0,1]) {|a, i| a.push(a[-2] + a[-1])}

Although, when it comes to Fibonacci, Haskell just rules, IMHO:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Zipping an infinite list with itself to produce itself … brilliant.

jwm

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 14, 2009, 6:00am UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/8 "2009-07-14T06:00:49Z")

</div>

Todd B. wrote:

> 2009/7/13 Jï¿½rg W Mittag [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > Zipping an infinite list with itself to produce itself … brilliant.
> 
> Ha! That is just cool.
> 
> Todd

Of course it can be sort of translated into ruby (see attached for lazy  
list implementation):

FIBS = LL[0, LL[1, lambda{FIBS.zip\_with(FIBS.tail, &:+)}]]

-----Jay

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [July 13, 2009, 6:25pm UTC](https://www.ruby-forum.com/t/fibonacci-numbers-newbie-question/171959/9 "2009-07-13T18:25:47Z")

</div>

2009/7/13 Jörg W Mittag [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Zipping an infinite list with itself to produce itself … brilliant.

Ha! That is just cool.

Todd
