作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始学习 haskell,想知道是否有任何方法可以用 C# 或 java 或其他非惰性命令式语言实现以下斐波那契数列。
在 Haskell 中,我们可以使用以下行简洁地生成斐波那契数列
fibonacci = 0 : 1 : zipWith (+) fibonacci (tail fibonacci)
问题 - 我知道随着 C#/Java 等的急切评估,上面的内容可能会进入无限循环。但我不明白的是,即使我们使用 thunk,我们如何才能创建一个自引用数据结构,当我们迭代它时它会发生变化(使用递归)。
如果您能分享一些片段,我们将不胜感激
最佳答案
Scala API docs for Stream包含有关如何在 Scala 中执行此操作的示例:
val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map { n => n._1 + n._2 }
编辑:要使用像 Haskell 这样没有内置内存功能的语言来实现记忆化,您显然需要使用变异(数组或映射)。例如:
val fib: Int => Int = {
val m = ArrayBuffer(0, 1)
x => if (x < m.size) m(x) else {
println("Calculating " + x + "...")
val r = fib(x - 2) + fib(x - 1)
m += r
r
}
}
这仍然可以被认为是一个纯函数,因为在单线程环境中没有可观察到的副作用(除了运行时性能)。
关于java - 懒惰斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190592/
我是一名优秀的程序员,十分优秀!