【发布时间】:2017-01-13 08:11:48
【问题描述】:
我正在自学 scala 并努力提高我的 FP 技能。
我的参考资料之一,编程语言基础 (available here),有一个方便的简单递归函数列表。在第 27/50 页,我们被要求实现 swapper() 函数。
(swapper s1 s2 slist) returns a list the same as slist, but
with all occurrences of s1 replaced by s2 and all occurrences of s2 replaced by s1.
> (swapper ’a ’d ’(a b c d))
(d b c a)
> (swapper ’a ’d ’(a d () c d))
(d a () c a)
> (swapper ’x ’y ’((x) y (z (x))))
((y) x (z (y)))
在 Scala 中,这是:
swapper("a", "d", List("a","b","c","d"))
swapper("a", "d", List("a","d",List(),"c","d"))
swapper("x", "y", List( List("x"), "y", List("z", List("x"))))
我的 scala 版本处理所有版本,除了最后的 x。
def swapper(a: Any, b: Any, lst: List[Any]): List[Any] ={
def r(subList :List[Any], acc : List[Any]): List[Any] ={
def swap (x :Any, xs: List[Any]) =
if(x == a){
r(xs, acc :+ b)
} else if (x == b) {
r(xs, acc :+ a)
} else {
r(xs, acc :+ x)
}
subList match {
case Nil =>
acc
case List(x) :: xs =>
r(xs, r(List(x), List()) +: acc)
case x :: xs =>
swap(x,xs)
//case List(x) :: xs =>
}
}
r(lst, List())
}
本能地,我认为这是因为我在“case List(x) :: xs”部分没有交换,但我仍在努力修复它。
更困难的是,这种情况仍然破坏了尾调用优化。我该怎么做?在哪里可以了解有关通用解决方案的更多信息?
【问题讨论】:
标签: scala recursion functional-programming lisp tail-recursion