我正在完成Scala实验的内容,正在构建一个函数,最终会返回类似于这样的结果:
tails(List(1,2,3,4)) = List(List(1,2,3,4), List(2,3,4), List(3,4), List(4), List())
我通过使用两个函数并在第二个函数上使用一些递归来使其工作。
def tails[T](l: List[T]): List[List[T]] = {
if ( l.length > 1 )trailUtil(List() ::: List(l))
else List() ::: List(l);
}
def trailUtil[T](l:List[List[T]]) : List[List[T]] = {
if ( l.last.length == 0)l
else trailUtil(l :+ l.last.init);
}
这都很好,但我需要两个函数来实现这个。我试着用匿名函数替换
trailUtil(List() ::: List(l))
,但我的 IDE 报错说type mismatch; found :List[List[T]] required:Int
。请帮我看看。val ret : List[List[T]] = (ll:List[List[T]]) => {
if ( ll.last.length == 0) ll else ret(ll :+ ll.last.init)
}
ret(List() ::: List(1))
请问有人能指出我做错了什么,或者提供更好的方法吗?
(我看过这篇stackoverflow帖子,但不同类型对我来说都不起作用):
(inputs) => expression
的形式,即没有名称。我不知道在Scala中是否可以递归一个没有名称的函数。在Javascript中,可以使用已弃用的callee
来实现。 - Shelby Moore III