在scala中,我需要编写一种方法来查找给定数字中每个数字的乘积。我有以下片段。
def productDigits(number: Int): Int = {
def helper(current: Int, accumulator: Int): Int = {
current match {
case current if current < 10 => accumulator * current
case _ => helper(current / 10, accumulator * (current % 10))
}
}
helper(number, 1)
}
还有更好的方法吗?
这里是OP的递归解决方案与Luis的一线相比的基准。
正在执行
sbt "jmh:run -i 10 -wi 10 -f 2 -t 1 bench.So59652263"
where
@State(Scope.Benchmark)
@BenchmarkMode(Array(Mode.Throughput))
class So59652263 {
def _dexter2305(number: Int): Int = {
def helper(current: Int, accumulator: Int): Int = {
current match {
case current if current < 10 => accumulator * current
case _ => helper(current / 10, accumulator * (current % 10))
}
}
helper(number, 1)
}
def _luis(number: Int): Int = number.toString.map(_.asDigit).product
val num: Int = (math.random * 100000000).toInt
@Benchmark def dexter2305: Int = _dexter2305(num)
@Benchmark def luis: Int = _luis(num)
}
给予
[info] So59652263.dexter2305 thrpt 20 89093066.408 ± 1825286.801 ops/s
[info] So59652263.luis thrpt 20 11585098.230 ± 272966.526 ops/s
我们看到递归解决方案的吞吐量似乎比单行代码高7倍。
number
为String
而不是Int
时的基准测试>
@State(Scope.Benchmark) @BenchmarkMode(Array(Mode.Throughput)) class So59652263 { def _dexter2305(number: String): Int = { def helper(current: Int, accumulator: Int): Int = { current match { case current if current < 10 => accumulator * current case _ => helper(current / 10, accumulator * (current % 10)) } } helper(number.toInt, 1) } def _luis(number: String): Int = number.map(_.asDigit).product val num: String = (math.random * 100000000).toInt.toString @Benchmark def dexter2305: Int = _dexter2305(num) @Benchmark def luis: Int = _luis(num) }
给予
[info] Benchmark Mode Cnt Score Error Units [info] So59652263.dexter2305 thrpt 20 36237007.844 ± 1631349.975 ops/s [info] So59652263.luis thrpt 20 13975984.042 ± 1890083.941 ops/s
我们看到递归解仍然具有较高的吞吐量,但是比
number
为Int
时小2.5倍。