私は再帰が苦手で(これが私がこれに取り組んでいる理由です)、これを行う方法を理解するのに苦労しています:("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 に答える