【发布时间】:2016-06-12 21:09:02
【问题描述】:
我从表面上阅读了几篇关于延续传递风格的博客文章/维基百科。我的高级目标是找到一种系统化的技术来使任何递归函数(或者,如果有限制,请注意它们)尾递归。但是,我很难表达我的想法,我不确定我的尝试是否有意义。
出于示例的目的,我将提出一个简单的问题。目标是,给定一个唯一字符的排序列表,按字母顺序输出由这些字符组成的所有可能的单词。例如,sol("op".toList, 3) 应该返回 ooo,oop,opo,opp,poo,pop,ppo,ppp。
我的递归解决方案如下:
def sol(chars: List[Char], n: Int) = {
def recSol(n: Int): List[List[Char]] = (chars, n) match {
case (_ , 0) => List(Nil)
case (Nil, _) => Nil
case (_ , _) =>
val tail = recSol(n - 1)
chars.map(ch => tail.map(ch :: _)).fold(Nil)(_ ::: _)
}
recSol(n).map(_.mkString).mkString(",")
}
我确实尝试通过添加一个函数作为参数来重写它,但我没有设法做出我确信是尾递归的东西。我不想在问题中包含我的尝试,因为我为他们的幼稚感到羞耻,所以请原谅我。
因此问题基本上是:上面的函数如何用 CPS 编写?
【问题讨论】:
标签: scala tail-recursion continuation-passing