这一个:
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 + b
是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)
中的下一对数字。