note
	description: "The Fibonacci number sequence"
	library: "Free implementation of ELKS library"
	status: "See notice at end of class."
	legal: "See notice at end of class."
	names: fibonacci
	date: "$Date: 2018-12-15 18:06:16 +0000 (Sat, 15 Dec 2018) $"
	revision: "$Revision: 102608 $"

class 
	FIBONACCI

inherit
	COUNTABLE_SEQUENCE [INTEGER_32]
		rename
			has as is_fibonacci
		redefine
			is_fibonacci
		end

	ITERATION_CURSOR [INTEGER_32]

create 
	default_create

feature -- Access

	First: INTEGER_32 = 1

	Second: INTEGER_32 = 1

	higher_fibonacci (n: INTEGER_32): INTEGER_32
			-- 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
		ensure
			instance_free: class
		end

	lower_fibonacci (n: INTEGER_32): INTEGER_32
			-- 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
		ensure
			instance_free: class
		end

	all_lower_fibonacci (n: INTEGER_32): ARRAY [BOOLEAN]
			-- 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_32
		do
			from
				create Result.make_filled (False, 1, n)
				j := 1
				i := i_th (j)
			until
				i > n
			loop
				Result.put (True, i)
				j := j + 1
				i := i_th (j)
			end
		ensure
			instance_free: class
		end

	is_fibonacci (n: INTEGER_32): BOOLEAN
			-- Is n a Fibonacci number?
		local
			to_test, count: INTEGER_32
		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
		ensure then
			instance_free: class
		end

	i_th (i: INTEGER_32): INTEGER_32
			-- The i-th Fibonacci number
		local
			count: INTEGER_32
			last, second_last: INTEGER_32
		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
		ensure then
			instance_free: class
		end
	
feature -- Iteration

	new_cursor: FIBONACCI
			-- Fresh cursor associated with current structure
		do
			create Result;
			Result.start
		ensure then
			instance_free: class
		end
	
note
	copyright: "Copyright (c) 1984-2018, Eiffel Software and others"
	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
		Eiffel Software
		5949 Hollister Ave., Goleta, CA 93117 USA
		Telephone 805-685-1006, Fax 805-685-6869
		Website http://www.eiffel.com
		Customer support http://support.eiffel.com
	]"

end -- class FIBONACCI

Generated by ISE EiffelStudio