(fibonacci (+ b 1) a + b)
Здесь вы вызываете функцию fibonacci
с четырьмя аргументами: результат (+ b 1)
, значение переменной a
, функция +
и значение переменной b
,Поскольку fibonacci
было определено только для двух аргументов, вы получаете ошибку, которую вы делаете.
Как только вы исправите это, вы получите ошибку переполнения стека, не видя никакого вывода.Это потому, что вы поставили рекурсивный вызов fibonacci
в качестве аргумента println
.Поэтому он попытается выполнить рекурсивный вызов перед выполнением println
.Поскольку рекурсия бесконечна, вызов println
никогда не произойдет.Что вы должны сделать, это сначала напечатать номер, а затем рекурсивно вызвать fibonacci
.
После того, как вы сделаете это, программа напечатает много чисел, но стек все равно будет переполнен.Это потому, что clojure не оптимизирует удаленные вызовы хвоста, поэтому даже при использовании хвостовой рекурсии бесконечная рекурсия вызовет переполнение стека.Чтобы предотвратить это, используйте форму recur
вместо обычной рекурсии.
В дополнение к этим пунктам ваша программа будет печатать неправильные числа, поскольку вы неправильно реализовали последовательность Фибоначчи.