main
1require "spec_helper"
2
3def factorial(n)
4 if n == 0
5 1
6 else
7 n * factorial(n-1)
8 end
9end
10
11def fibonacci(n)
12 n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2)
13end
14
15def fibonacci_enumerator
16 Enumerator.new do |yielder|
17 i, j = 0, 1
18 loop do
19 i, j = j, i + j
20 yielder.yield i
21 end
22 end
23end
24
25describe "fibonacci" do
26 let(:sut) { Fibonacci.new }
27
28 xit "should return the correct result" do
29 #0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
30 expect(sut.get(0)).to eq(0)
31 expect(sut.get(1)).to eq(1)
32 end
33
34 it "should return the first n numbers in fibonacci" do
35 f = ->(x){ x < 2 ? x : f.call(x-1) + f.call(x-2) }
36 20.times do |n|
37 expect(fibonacci(n)).to eq(f.call(n))
38 end
39 end
40
41 it "can enumerate forever" do
42 fibonacci_enumerator.take_while { |n| n < 1000 }
43 end
44
45 it "can do factorial" do
46 (1..10).each do |n|
47 expect(factorial(n)).to eq((1..n).inject { |total, i| (i) * total })
48 end
49 end
50end