我不明白单线圈haskell斐波那契

时间:2017-11-02 14:54:45

标签: haskell list-comprehension fibonacci

这一个:

fib = 1 : 1 : [a + b | (a, b) <- zip fib (tail fib)]

据我所知,起初fib是[1,1,..]

.. =列表的其余部分)

所以这里fib = [1, 1, ..]tail fib = [1, ..]所以(a, b)(1, 1),转化为a + b 2现在列表看起来像这样:

fib = 1 : 1 : 2 : [a + b | (a, b) <- zip fib (tail fib)]

在这里我感到困惑:

现在我认为fib[1, 1, 2, ..]tail fib[1, 2, ..] 如果我zip列表,我再次认为a + b1 + 1,因为这些仍然是两个列表中的第一个元素。 我在哪里错了?

(我知道我但我不明白为什么以及这里发生了什么)

1 个答案:

答案 0 :(得分:2)

你是对的

fib = 1 : 1 : [a + b | (a, b) <- zip fib (tail fib)]

生成下一个元素为2.但是,fib = 1 : 1 : 2 : [a + b | (a, b) <- zip fib (tail fib)]对于下一步不准确。由于您在此步骤中评估zip fib (tail fib),因此必须从其定义中替换它,而不是保留原样。更准确的公式看起来像:

fib = 1 : 1 : 2 : [a + b | (a, b) <- zip (tail fib) (tail (tail fib)]

考虑zip评估的一种方法是每个应用程序使用每个给定列表的下两个头元素。在这种情况下,下一次迭代将返回(a, b) = (1, 2),因为这是fib(tail fib)中的下一对数字。