私はエクササイズ目的のために、機能的に2つのScalaのListメソッドを実装しようとしていました。そのうちの1つはpartition
です。次のシグネチャを想定:Scalaのリストのパーティションメソッドのテール再帰的実装
def partition[T](l: List[T], f: T => Boolean): (List[T], List[T])
これは、2つのリストからなるタプルを返す - 最初のものは、渡された述語f
と他のすべての要素を含む別のものを満たすl
からすべての要素を含んでいます。
私は残念ながら末尾再帰ではありません、次の再帰的な解決策を考え出した:アキュムレータは、いくつかのケースで使用することができることが明らかにされている。このスタックオーバーフローの問題(Can all recursive functions be re-written as tail-recursions?)で
def partition[T](l: List[T], f: T => Boolean): (List[T], List[T]) = {
l match {
case Nil => (Nil, Nil)
case head :: rest => {
val (left, right) = partition(rest, f)
if (f(head))
(head :: left, right)
else
(left, head :: right)
}
}
}
。与えられたものでは、逆の方法で最終的なリストを返すので、これは不可能であると私は主張します。
テール再帰的な解決策を教えてください。たぶん継続的な経過(私はそれがどのように動作し、どのようにそれが適用できるか理解していない)があったとしても?
返す前に結果を元に戻すことができます。 – Dima