查找给定数字中每个数字的乘积
Find product of every digit in the given number
在 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 的单线解决方案的 jmh 基准测试。
正在执行
sbt "jmh:run -i 10 -wi 10 -f 2 -t 1 bench.So59652263"
哪里
@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。
在 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 的单线解决方案的 jmh 基准测试。
正在执行
sbt "jmh:run -i 10 -wi 10 -f 2 -t 1 bench.So59652263"
哪里
@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。