我有点讨厌递归(这就是我研究这个的原因)而且我很难弄清楚如何做到这一点:("Hello" foldLeft(1))((x, y) => x * y.toInt)
递归。有什么想法吗?
问问题
564 次
4 回答
4
scala> def r(s : String) : Int = {
| s match {
| case "" => 1
| case _ => s.head.toInt * r(s.tail)
| }
| }
r: (s: String)Int
scala> r("hello")
res4: Int = 714668928
于 2012-07-04T00:48:14.767 回答
3
我将另一个答案转换为我认为的尾递归版本:
@tailrec
def r(acc: Int, s: String): Int = {
s match {
case "" => acc
case _ => r(s.head.toInt * acc, s.tail)
}
}
print(r(1, "hello"))
有关将此类函数转换为尾递归格式的一般建议,请参阅此答案:
于 2012-07-04T01:21:17.650 回答
1
这是使用累加器的尾递归版本。这个版本也有一个干净的 API。
import scala.annotation.tailrec
def unicodeProduct(string: String): Int = {
@tailrec
def unicodeProductAcc(string: String, acc: Int): Int = {
string match{
case "" => acc
case _ => unicodeProductAcc(string.tail, string.head.toInt * acc )
}
}
unicodeProductAcc(string, 1)
}
scala> :load unicodeProduct.scala
Loading unicodeProduct.scala...
import scala.annotation.tailrec
unicodeProduct: (string: String)Int
scala> unicodeProduct("hello")
res0: Int = 714668928
于 2012-07-04T02:39:13.067 回答
0
过时了,但是下面的问题是什么?
def product_recursive(s: String): Long = {
if (s.length == 1)
s.head.toLong
else
s.head.toLong * product_recursive(s.tail)
}
于 2019-03-03T00:17:45.880 回答