我正在尝试在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
下面的评论是有道理的,但它仍然让我犯了错误。我认为编辑过的代码是一种更容易获得我想要的方式
然而,现在我得到一个无限循环。我错过了什么部分逻辑?
答案 0 :(得分:2)
递归函数通常必须逐渐地“关闭”。输入数据的片段直到没有任何东西 - 否则它永远不会终止。
在您的特定情况下,这意味着每个递归调用必须减少length
,直到它达到零。
def listMaker[A](length:Int, f:Int =>A):List[A] = length match{
case 0 => List()
case _ => listMaker(length,f)
}
但是你没有减少length
- 你将它保持不变到下一个递归调用,所以,你的函数不能终止。
(还有其他问题 - 你需要在递归时建立结果列表,但是你当前的代码只返回一个空列表。我认为这是一个学习练习,所以我没有提供工作代码...)。