gpt4 book ai didi

Scala - 匿名函数的递归

转载 作者:行者123 更新时间:2023-12-04 14:33:17 25 4
gpt4 key购买 nike

我正在研究 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))对于匿名函数,但我收到此错误 type mismatch; found :List[List[T]] required:Int从 IDE。
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))

有人可以指出我做错了什么,或者有更好的方法来做这件事。

(我确实看过 this 所以帖子,但不同的类型对我不起作用):

最佳答案

那这个呢:

def tails[T](l: List[T]): List[List[T]] = 
l match {
case h :: tail => l :: tails(tail)
case Nil => List(Nil)
}

还有一点不那么惯用的版本:
def tails[T](input: List[T]): List[List[T]] =
if(input.isEmpty)
List(List())
else
input :: tails(input.tail)

BTW 尽量避免 List.length ,它在 O(n) 时间内运行。

更新:正如tenshi所建议的,尾递归解决方案:
@tailrec def tails[T](l: List[T], init: List[List[T]] = Nil): List[List[T]] =
l match {
case h :: tail => tails(tail, l :: init)
case Nil => init
}

关于Scala - 匿名函数的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com