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 回答
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 回答