EiffelBase class
(HTML page generated by ISE Eiffel 4.2)
Eiffel Class
indexing
description: "The Fibonacci number sequence";
status: "See notice at end of class";
names: fibonacci;
date: "$Date: 2007-03-30 11:10:11 -0800 (Fri, 30 Mar 2007) $";
revision: "$Revision: 95354 $"
class FIBONACCI
inherit
COUNTABLE_SEQUENCE [INTEGER]
rename
has as is_fibonacci
redefine
i_th, is_fibonacci
end
feature -- Access
First: INTEGER is 1;
Second: INTEGER is 1;
higher_fibonacci (n: INTEGER): INTEGER is
-- Lowest Fibonacci number greater than or equal to n
do
if n <= first then
Result := first
else
from
Result := n
until
is_fibonacci (Result)
loop
Result := Result + 1
end
end
end;
lower_fibonacci (n: INTEGER): INTEGER is
-- Greatest Fibonacci number lower than or equal to n
require
argument_big_enough: n >= second
do
if n = second then
Result := second
else
from
Result := n - 1
until
is_fibonacci (Result)
loop
Result := Result - 1
end
end
end;
all_lower_fibonacci (n: INTEGER): ARRAY [BOOLEAN] is
-- Array of n boolean values, where the
-- value at index i is true if and only if
-- i is a Fibonacci number.
local
i, j: INTEGER
do
from
create Result.make (1, n);
j := 1;
i := i_th (j)
until
i > n
loop
Result.put (true, i);
j := j + 1;
i := i_th (j)
end
end;
is_fibonacci (n: INTEGER): BOOLEAN is
-- Is n a Fibonacci number?
local
to_test, count: INTEGER
do
if n <= first then
Result := false
elseif n = first then
Result := true
else
from
count := first;
to_test := i_th (count)
until
to_test >= n
loop
count := count + 1;
to_test := i_th (count)
end;
Result := to_test = n
end
end;
i_th (i: INTEGER): INTEGER is
-- The i-th Fibonacci number
local
count: INTEGER;
last, second_last: INTEGER
do
if i = 1 then
Result := first
elseif i = 2 then
Result := second
else
from
last := second;
second_last := first;
count := 2
until
count = i
loop
Result := last + second_last;
second_last := last;
last := Result;
count := count + 1
end
end
end;
end -- class FIBONACCI
|