【发布时间】:2019-12-03 17:57:22
【问题描述】:
虽然该线程可用,但我不被允许在答案下提出我的问题(由于声誉点),因此我必须为此创建一个新问题。 (我只是 stackoverflow 的新手 :)
关于以下 fibs 功能的工作原理,我没有清楚地理解一点
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
nichijou 在下面我从 nichijou 引用的线程中逐步解释了:
一开始,用fibs和tail fibs,我们可以得到第三个:
fibs : [1, 1, ? tail fibs : [1, ? zipWith (+) fibs (tail fibs): [2, ?现在,我们知道第三个是 2,我们可以得到第四个:
fibs : [1, 1, 2, ? tail fibs : [1, 2, ? zipWith (+) fibs (tail fibs): [2, 3, ?现在是 5 号:
fibs : [1, 1, 2, 3, ? tail fibs : [1, 2, 3, ? zipWith (+) fibs (tail fibs): [2, 3, 5, ?等等..
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
我的问题是,在第二步之后,我们如何去除列表中的重复项?我期待看到第二步应该生成一个列表
[1, 1, 2, 2, 3]
下一步也是如此……
【问题讨论】:
-
我们没有生成重复项。您在哪里看到重复项?
-
提出一个新问题是正确的做法。您应该避免将列表视为按“步骤”发展的。当我们在该定义中提到
fibs时,我们实际上是指整个列表。接受的答案更能解释这一点。 -
@WillemVanOnsem 在运行代码中没有重复,它工作得很好,但我想知道当我自己迭代递归时为什么没有重复。现在答案澄清了我的想法,更好地理解了这个过程。