我是 clojure 的新手,他想看看有什么大惊小怪的。确定感受它的最佳方法是编写一些简单的代码,我想我会从斐波那契函数开始。
我的第一个努力是:
(defn fib [x, n]
(if (< (count x) n)
(fib (conj x (+ (last x) (nth x (- (count x) 2)))) n)
x))
要使用它,我需要在调用函数时用 [0 1] 为 x 设置种子。我的问题是,如果不将其包装在单独的函数中,是否可以编写一个只需要返回元素数量的函数?
做一些阅读让我找到了一些更好的方法来实现相同的功能:
(defn fib2 [n]
(loop [ x [0 1]]
(if (< (count x) n)
(recur (conj x (+ (last x) (nth x (- (count x) 2)))))
x)))
和
(defn fib3 [n]
(take n
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))
无论如何,更多的是为了练习而不是其他任何事情,任何人都可以用更好的纯递归斐波那契函数版本来帮助我吗?或者也许共享一个更好/不同的功能?
最佳答案
回答你的第一个问题:
(defn fib
([n]
(fib [0 1] n))
([x, n]
(if (< (count x) n)
(fib (conj x (+ (last x) (nth x (- (count x) 2)))) n)
x)))
这种类型的函数定义称为多元函数定义。您可以在此处了解更多信息:http://clojure.org/functional_programming
至于更好的 Fib 函数,我觉得你的 fib3 函数非常棒,展示了很多函数式编程概念。
关于recursion - Clojure 中的递归斐波那契函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8939970/