1

私は再帰が苦手で(これが私がこれに取り組んでいる理由です)、これを行う方法を理解するのに苦労しています:("Hello" foldLeft(1))((x, y) => x * y.toInt)再帰的に。何かご意見は?

4

4 に答える 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 に答える