【发布时间】:2015-08-27 11:53:01
【问题描述】:
我刚开始学习 Haskell 几个小时,试图理解这是什么 The Fibonacci sequence 确实:
fibs = 0 : 1 : next fibs
where
next (a : t@(b:_)) = (a+b) : next t
next 函数对我来说很奇怪,它最终会得到一些“无效”的输入,就像一开始它是这样的:
next (0:1) = (0+1) : next [1]
但是next ([1]) 是不可操作的,因为t@(b:_) 没有输入。那么next 是如何工作的呢?
我的下一个困惑是fib 本身,因为它假设是一个斐波那契数列,我假设它会在第一步之后得到fibs = 0 : 1 : 1 : next fibs,但是我们需要计算next([0, 1, 1]) 女巫给出(0+1): next([1, 1]) == 1 : next([1, 1]),我们得到初始元素 1,所以在 next([0, 1, 1]) 中,列表的第一个值(在下一个 fib 中)将是 1,但是将此 1 附加到原始 fib,我们得到0 : 1 : 1 : 1,即不是斐波那契数列。
我想我误解了一些东西,那么它实际上是如何工作的?
【问题讨论】:
-
第一行中对
fibs的引用指的是整个(无限)列表,而不仅仅是明确定义的两个元素。第一步不是next (0:1),而是next (0:1:next fibs),计算结果为(0+1) : next (1:next fibs)。从不涉及像 [0, 1, 1] 这样的有限列表。
标签: haskell