Вход: положительное целое число.Как проверить, является ли число Фибоначчи в Clojure?
Выход: истина/ложь на основе теста.
Вот моя попытка:
(defn is-a-fib? [x]
"Check whether x is a fibonacci number.
Algorithm: test whether 5x^2+4 or 5x^2-4 is a perfect square."
(let [a (+' (*' (Math/pow x 2) 5) 4) ; 5x^2+4
b (-' (*' (Math/pow x 2) 5) 4) ; 5x^2-4
sqrt-a (Math/sqrt a)
sqrt-b (Math/sqrt b)]
(or (== (*' sqrt-a sqrt-a)
(*' (Math/floor sqrt-a) (Math/floor sqrt-a))) ; Test whether n is a perfect square
(== (*' sqrt-b sqrt-b)
(*' (Math/floor sqrt-b) (Math/floor sqrt-b))))))
Проблема заключается в том: этот код не работает для большого числа. Я думаю, что это может привести к переполнению стека. Есть ли лучший способ?
Что заставляет вас думать, что это вызывает переполнение стека? Знаете ли вы, что такое переполнение стека? (кажется, вы этого не делаете). И нет, это не проблема. Проблема гораздо более вероятна для операций с плавающей запятой. –