- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Scala,在学习过程中,我遵循了 Brien (http://www.knowing.net/index.php/2006/06/16/15-exercises-to-know-a-programming-language-part-1/) 的 15 个练习。在第二个练习中,我应该实现 Haar 转换。我实现了大部分但是在尾递归的返回值上挣扎了几个小时。由于编译器不编译 ++
- 或者更确切地说 haar(averages)++ haar(averagesD)
行。
代码:
import scala.collection.mutable.ListBuffer
import scala.annotation.tailrec
object haarWavelet2 {
def avg(tpl:Tuple2[Double, Double]):Double = (tpl._1 + tpl._2) / 2.
def avgD(tpl:Tuple2[Double, Double]):Double = (tpl._1 - tpl._2) / 2
def total_avg(nums:ListBuffer[Double]):Double = nums.sum / nums.length
@tailrec
def haar(nums:ListBuffer[Double]):ListBuffer[Double] = {
if (nums.length == 1) {return nums}
val buffer = new ListBuffer[Tuple2[Double, Double]]
for (i <- 0 to nums.length-1 by 2) buffer.append((nums(i), nums(i+1)))
val averages = for(tpl <- buffer) yield avg(tpl)
val averagesD = for(tpl <- buffer) yield avgD(tpl)
haar(averages) ++ haar(averagesD) // does not compile
}
def main(args: Array[String]): Unit = {
print(haar(ListBuffer(8., 5., 6., 2.)))
}
}
最佳答案
尾递归具有以下形式:
def func(x..., value){
if(condition) return value
else func(y..., value')
}
如果您查看此表单,您会看到,为了评估 func
,我需要的只是 func
本身,但具有一组不同的参数。因此,栈上只有一项,很容易转化为迭代算法。
你的实现看起来像这样:
def func(x...){
if(condition) return value
else func(y...) + func(z...)
请注意,为了计算 func
,您必须首先计算 func
,运算符 +
,然后再次计算“func”。因此,这 3 个项目需要以非常真实的评估顺序放置在堆栈中,不适合尾调用优化。
关于Scala:尾递归和 ListBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21123404/
我从简单的文本文件中读取了几个值。 这是我的数据: val data = new ListBuffer[(String, BigDecimal)] 现在我想在我的 ListBuffer 中附加项目:
我正在学习 Scala,在学习过程中,我遵循了 Brien (http://www.knowing.net/index.php/2006/06/16/15-exercises-to-know-a-pr
如果可能的话,我将如何从 java.lang.ListBuffer 中循环遍历 ListBuffer?ListBuffer 的初始化(在 scala 中) var newModVersions: Li
不幸的是, scala.util.parsing.input.Position 没有扩展 Ordering[Position] 。 要根据错误的位置对错误的 ListBuffer 进行排序,我使用以下
使用 Scala 2.10.3。以下代码对我有用: val sequence = new ListBuffer[Int]() sequence.+=:(x) 但是如果我写: val sequence
根据 this posting ,据说 ListBuffer 允许恒定时间删除第一个和最后一个元素。我一直在查看 API 引用和 ListBuffer 源代码,但我找不到如何在恒定时间内删除最后一个元
我有一个 ListBuffer。我想删除满足特定条件的所有元素。 我可以迭代它并删除每个元素。但是 Scala 对改变你正在迭代的列表有什么看法呢?它会起作用,还是会删除错误的元素/不返回所有元素?
有没有办法有效地做到这一点,也许通过 toBuffer 或方法?我真正的问题是我正在从解析器构建一个列表,如下所示: lazy val nodes: Parser[List[Node]] = phra
Scala 列表是否有简单的随机播放功能? 如果没有,最简单的实现方法是什么? 我在整个代码中有很多这样的事情要做,所以调用越简单越好 Ruby 中的示例 a = [ 1, 2, 3 ]
Scala 的MutableList 有什么区别?和 ListBuffer scala.collection.mutable 中的类(class)?您什么时候使用一个与另一个? 我的用例是有一个线性序
Scala 中有没有一种好方法可以从 ListBuffer 中删除多个索引(快速)? 示例: val indicesToDelete = List(4, 1) val buffer = ListBuf
我有一个 var x类型 ListBuffer[ListBuffer[Int]]我在其中使用函数 clone 进行克隆并设置为另一个 var y , 然后我使用函数 update在这个新 var y更
它是常数还是 O(n)?如果 O(n) 是否存在具有恒定时间大小操作的类似数据结构? 最佳答案 奇怪的是,size和 length在 ListBuffer docs 中有不同的描述.当然,ListBu
我有三个类,它们都实现了类似的功能,但在细微的细节上有所不同。我想创建一个抽象基类并将共享的代码移动起来。现在我卡住了。 每个子类都有一个 ListBuffer 保存另一个关系的对象,这是一些基本类型
我正在尝试创建一个可变的 Map使用默认值创建一个新的 ListBuffer当请求的元素不在 map 中时。但是,虽然新 map 作为默认值返回,但它不会保留在 map 中。也许这就是它的工作原理,我
看着 val sb = Seq.newBuilder[Int] println(sb.getClass.getName) sb += 1 sb += 2 val s = sb.result() pri
在scala中,为什么toSet()方法混淆了集合中元素的顺序(ListBuffer)? 我可以使用哪个集合来确保每个元素的唯一性并保持其原始顺序? 最佳答案 因为set抽象,是 traversabl
我正在寻找比这更清洁的解决方案: import scala.collection.mutable.ListBuffer val y = Array(1,2,3,4) val z = new ListB
我在播放应用程序中使用 Redis 作为捕捉。使用 Redis,我可以存储一些与键字符串相关联的字符串列表,就像在 case class Cache1 中一样: case class Cach
我在将对象 append 到 scala.collection.mutable.ListBuffer 时遇到问题。我熟悉相应的 API,并且知道通常您使用 += 或++= 方法来添加对象或对象序列。
我是一名优秀的程序员,十分优秀!