recursion - Clojure 中的递归斐波那契函数

标签 recursion clojure fibonacci

我是 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/

相关文章:

haskell - 从什么意义上说,一个函数的定义“定义”比另一个函数少?

unit-testing - 如何使用环模拟请求以 JSON 形式模拟测试 POST 请求?

math.combinatorics 中的 Clojure 惰性序列会导致 OutOfMemory (OOM) 错误

clojure - 如何比较向量中连续元素的值以进行过滤?

matlab - 在 MATLAB/octave 中为 n > 100 创建更快的斐波那契函数

c - 使用递归的斐波那契

scala - 使用递归的不同列表的总和

java - 当我的方法递归的唯一条件尚未满足时,为什么它会递归?

algorithm - 找到总和为特定值的所有子集

python - 计算斐波那契数时的取模问题