-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tribonacci Sequence.rb
73 lines (40 loc) · 1.69 KB
/
Tribonacci Sequence.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
=begin
Well met with Fibonacci bigger brother, AKA Tribonacci.
As the name may already reveal, it works basically like a Fibonacci, but summing the last 3
(instead of 2) numbers of the sequence to generate the next. And, worse part of it, regrettably
I won't get to hear non-native Italian speakers trying to pronounce it :(
So, if we are to start our Tribonacci sequence with [1, 1, 1] as a starting input (AKA signature),
we have this sequence:
[1, 1 ,1, 3, 5, 9, 17, 31, ...]
But what if we started with [0, 0, 1] as a signature? As starting with [0, 1] instead of [1, 1]
basically shifts the common Fibonacci sequence by once place, you may be tempted to think that
we would get the same sequence shifted by 2 places, but that is not the case and we would get:
[0, 0, 1, 1, 2, 4, 7, 13, 24, ...]
Well, you may have guessed it by now, but to be clear: you need to create a fibonacci function
that given a signature array/list, returns the first n elements - signature included of the so seeded sequence.
Signature will always contain 3 numbers; n will always be a non-negative number; if n == 0, then
return an empty array and be ready for anything else which is not clearly specified ;)
alternative solution; (not mine)
def tribonacci(s, n)
for i in 3..n
s[i] = s[i-1] + s[i-2] + s[i-3]
end
return s.slice(0, n)
end
=end
def tribonacci(signature,n)
y = 3
if n == 0
signature = []
elsif n == 1
signature = Array.new().push(signature[0])
elsif n == 2
signature.delete_at(2)
else
for num in 3..n - 1
signature.push(signature[y - 1] + signature [y - 2] + signature [y - 3])
y += 1
end
end
signature
end