Scala:Tail Recursion和ListBuffer

 郁涵珊学俊豪 发布于 2023-02-02 19:49

我正在学习Scala,在这样做的过程中,我遵循了Brien的15个练习(http://www.knowing.net/index.php/2006/06/16/15-exercises-to-know-a-programming -language-part-1 /)在第二个练习中,我应该实施哈尔变换.我实现了大部分内容但是在尾递归的返回值上花费了几个小时.由于编译器没有编译++- 或者更确切地说是行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.)))
  }
}

wheaties.. 5

尾递归具有以下形式:

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个项目放在堆栈上,并且具有非常实际的评估顺序,这不适合尾部调用优化.

1 个回答
  • 尾递归具有以下形式:

    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个项目放在堆栈上,并且具有非常实际的评估顺序,这不适合尾部调用优化.

    2023-02-02 19:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有