【问题标题】:Understanding recursive fibonacci function in Haskell了解 Haskell 中的递归斐波那契函数
【发布时间】:2019-12-03 17:57:22
【问题描述】:

虽然该线程可用,但我不被允许在答案下提出我的问题(由于声誉点),因此我必须为此创建一个新问题。 (我只是 stackoverflow 的新手 :)

关于以下 fibs 功能的工作原理,我没有清楚地理解一点

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

在这个stackoverflow thread

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 在运行代码中没有重复,它工作得很好,但我想知道当我自己迭代递归时为什么没有重复。现在答案澄清了我的想法,更好地理解了这个过程。

标签: haskell fibonacci


【解决方案1】:

让我们用更多的标签写出来:

fibs :: [Integer]
fibs = 1 : 1 : sumft
 where sumft = zipWith (+) fibs tfi
       tfi = tail fibs

那么,“起点”就是

 ╭── tfi ───────┈┄··
谎言:[1, 1, ?, ?, ...
              ╰── sumft ──┈┄··
tfi : [1, ?, ?, ?, ...
sumft: [2, ?, ?, ?,

现在,随着计算的进行,运行时不会移动任何东西或其他任何东西,它只是尝试用具体值填充? 符号。请记住,Haskell 中的一切都是不可变的。当我写?时,我的意思是我还不知道有什么价值,但原则上它已经预先确定了。

在这种情况下,运行时知道fibs 中的第一个? 来自sumft 的头部,其确切值现在已知:

 ╭─── tfi ──────┈┄··
fibs : [1, 1, 2, ?, ...
              ╰─◀ sumft ──┈┄··
tfi : [1, ?, ?, ?, ...
sumft: [2, ?, ?, ?,

现在,这个2tfi 中也是已知的:

 ╭──▶ tfi ──────┈┄··
fibs : [1, 1, 2, ?, ...
              ╰── sumft ──┈┄··
tfi : [1, 2, ?, ?, ...
sumft: [2, ?, ?, ?,

...因此我们可以执行下一个添加:

 ╭─── tfi ──────┈┄··
fibs : [1, 1, 2, ?, ...
              ╰── sumft ──┈┄··
tfi : [1, 2, ?, ?, ...
sumft: [2, 3, ?, ?,

因此,另一个数字,即sumft 的另一个元素,作为fibs 的一部分,也可以在那里使用。但它仍然出现在相对于sumft 的头部的相同位置——即在2 之后。

 ╭─── tfi ──────┈┄··
fibs : [1, 1, 2, 3, ...
              ╰─◀ sumft ──┈┄··
tfi : [1, 2, ?, ?, ...
sumft: [2, 3, ?, ?,

这又在tfi中使用

 ╭──▶ tfi ──────┈┄··
fibs : [1, 1, 2, 3, ...
              ╰── sumft ──┈┄··
tfi : [1, 2, 3, ?, ...
sumft: [2, 3, ?, ?,

...等等等等。

【讨论】:

  • 感谢详细解释;很好理解。 :)
  • 你忘了在淡出中使用 U+254c :)
  • 始终提供出色的答案。其实很棒。很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2021-12-01
  • 2020-03-21
  • 2010-12-03
  • 2016-06-27
相关资源
最近更新 更多