【问题标题】:Error in recursive list logic递归列表逻辑错误
【发布时间】:2016-05-14 06:13:19
【问题描述】:

我正在尝试在给定输入(长度和函数)的 scala 中构建一个列表,输出将是一个从 0 到该长度-1 的列表。

例如:

listMaker(3,f) = List(0,1,2)

到目前为止,我已经创建了一个辅助类,它接受 2 个 int 并在该范围内返回一个 list

listMaker函数如下:

def listMaker[A](length:Int, f:Int =>A):List[A] = length match{
  case 0 => List()
  case _ => listMaker(length,f)
}

我的f 函数只接受一个变量 x 并返回它:

 def f(x:Int)=x 

下面的评论是有道理的,但它仍然让我出错。我认为编辑后的代码更容易到达我想去的地方

但是,现在我得到了一个无限循环。我遗漏了哪一部分逻辑?

【问题讨论】:

  • 您的函数 arg f 声明它接受 Int 并返回 A。您正在尝试调用f,传入listHelper 的结果,您说它返回List[Int]。您正在尝试将 List[Int] 提供给您定义为采用 Int 的函数,因此类型不匹配
  • 你认为非零的情况有什么作用?您需要使用整数调用 f,并将其添加到长度为 length-1 的列表中。相反,您只是使用相同的参数递归调用自己 => 无限循环
  • “但是,现在我得到一个空列表作为返回” 在我写这篇文章时,您的问题中的代码不会给出一个空列表,而是无限循环。所以你没有运行那个代码。我们无法猜测您实际使用的是什么代码,因此我们无法说出您错过了什么。
  • 我的测试出错了。我没有保存为此编写的新测试用例。所以空列表指的是别的东西。所以现在我意识到,这个特定的案例确实会永远循环。我会编辑那个...
  • f 属于 A 型,不需要 int..

标签: scala recursion


【解决方案1】:

递归函数通常必须逐渐“咬掉”输入数据的片段,直到一无所有 - 否则它永远无法终止。

在您的特定情况下,这意味着 length 必须在每次递归调用时减少,直到达到零。

def listMaker[A](length:Int, f:Int =>A):List[A] = length match{
  case 0 => List()
  case _ => listMaker(length,f)
}

但您并没有减少 length - 您将其原封不动地传递给下一个递归调用,因此您的函数无法终止。

(还有其他问题——你需要在递归时建立你的结果列表,但你当前的代码只是返回一个空列表。我认为这是一个学习练习,所以我不提供工作代码.. .).

【讨论】:

  • 我有一个辅助方法,它接受两个 int 并输出一个列表。我相信我必须在这个函数中工作。我在将 f 作为参数的 listMaker 上遇到了困难。
  • 是的,这是一个书本练习。我只是想学习一些编程方面的新技能。
猜你喜欢
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2012-08-02
  • 1970-01-01
  • 2015-07-11
相关资源
最近更新 更多