【问题标题】:Understanding these Fibonacci functions in Clojure了解 Clojure 中的这些斐波那契函数
【发布时间】:2014-01-30 04:49:58
【问题描述】:

我试图理解的代码由两个函数组成:

(defn fib-step [[a b]]
  [b (+ a b)])

我很确定我已经弄清楚了。它使用宏 (defn) 创建一个命名函数 (fib-step),该函数接受 n 个参数。然后它将这些参数解构为两个变量,a 和 b。它首先返回一个由 b 组成的向量,然后将 a 和 b 相加。

我现在正在尝试使用此功能:

(defn fib-seq []
  (map first (iterate fib-step [0 1])))

同样,它使用宏来创建命名函数 fib-seq。我想我理解使用 [0 1] 向量播种的迭代函数,但我对 ma​​pfirst 函数感到困惑。

我知道 map 需要一个函数和一个序列,那么为什么他们使用“first”呢?

为什么我不能写

(take 5 (iterate fib-step [0 1]))

要获取惰性序列中的前 5 个数字?这张地图的目的是什么?

抱歉问了这么一个基本问题:(

【问题讨论】:

    标签: clojure


    【解决方案1】:

    使用 REPL:

    (take 5 (iterate fib-step [0 1]))
    ;=> ([0 1] [1 1] [1 2] [2 3] [3 5])
    

    这就是你想要的吗?不,[f_n f_{n+1}] 的输入fib-step 的输出是[f_{n+1} f_{n+2}]f_{n+1} 术语已重复。此外,输出是成对的。

    您真正想要的是每对中的第一对。

    如何获得第一? first

    你如何在配对序列上做到这一点? map

    【讨论】:

    • 啊,我想它只是点击了我。迭代必须获取自身的输出才能知道如何增加自身,对吗?而且因为我们需要处理序列中的前一个数字,所以我们总是必须传递对。
    • Iterate 只是一个循环结构,它将每个步骤的结果作为惰性序列的一部分返回。这只是经典模式的一种变体,它通常包括尾递归,以实现纯粹的功能循环。这种变体的目标是让循环在每一步中产生部分结果,以在理论上允许无限循环,并且能够仅按需进行必要的计算。
    猜你喜欢
    • 2017-04-03
    • 2012-02-14
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2019-12-03
    • 2014-05-03
    • 2012-11-05
    • 2017-07-08
    相关资源
    最近更新 更多