scala如何在n>;0

scala如何在n>;0,scala,while-loop,functional-programming,Scala,While Loop,Functional Programming,我想知道是否有一种更实用的方法来处理while(n>0)循环,我有一个小型Scala应用程序,它可以计算从1到n范围内等于K的位数: 例如,30和3将返回4[3,13,23,30] object NumKCount { def main(args: Array[String]): Unit = { println(countK(30,3)) } def countKDigit(n:Int, k:Int):Int = { var num = n

我想知道是否有一种更实用的方法来处理while(n>0)循环,我有一个小型Scala应用程序,它可以计算从1到n范围内等于K的位数: 例如,30和3将返回4[3,13,23,30]

object NumKCount {

  def main(args: Array[String]): Unit = {        
    println(countK(30,3))
  }

  def countKDigit(n:Int, k:Int):Int = {
      var num = n
      var count = 0
      while (num > 10) {
        val digit = num % 10
        if (digit == k) {count += 1}
        num = num / 10
      }
      if (num == k) {count += 1}                       
      count
  }

  def countK(n:Int, k:Int):Int = {          
    1.to(n).foldLeft(0)((acc, x) => acc + countKDigit(x, k))
  }
}

我正在寻找一种使用纯函数方法定义函数countKDigit的方法

假设
K
始终为1位,您可以将
n
转换为
String
,并使用
collect
filter
,如下所示(您可以使用
Integer
做的函数不多):

例如


以下方法如何:

scala> val myInt = 346763
myInt: Int = 346763

scala> val target = 3
target: Int = 3

scala> val temp = List.tabulate(math.log10(myInt).toInt + 1)(x => math.pow(10, x).toInt)
temp: List[Int] = List(1, 10, 100, 1000, 10000, 100000)

scala> temp.map(x => myInt / x % 10)
res17: List[Int] = List(3, 6, 7, 6, 4, 3)

scala> temp.count(x => myInt / x % 10 == target)
res18: Int = 2

计算数字序列中单个数字的出现次数

def countK(n:Int, k:Int):Int = {
  assert(k >= 0 && k <= 9)
  1.to(n).mkString.count(_ == '0' + k)
}

首先将数字
n
展开为一个数字序列

def digits(n: Int): Seq[Int] = {
  if (n < 10) Seq(n)
  else digits(n / 10) :+ n % 10
}
或者您可以使用
flatMap

def countK(n:Int, k:Int):Int = {
  1.to(n).flatMap(digits).count(_ == k)
}

您可以将
过滤器(c=>c.asDigit==k).length
替换为
count(\uu.asDigit==k)
def countK(n:Int, k:Int):Int = {
  assert(k >= 0 && k <= 9)
  1.to(n).mkString.count(_ == '0' + k)
}
def countKDigit(n:Int, k:Int, acc: Int = 0):Int =
  if (n == 0) acc
  else countKDigit(n/10, k, if (n%10 == k) acc+1 else acc)
def digits(n: Int): Seq[Int] = {
  if (n < 10) Seq(n)
  else digits(n / 10) :+ n % 10
}
def countKDigit(n:Int, k:Int):Int = {
  digits(n).count(_ == k)
}
def countK(n:Int, k:Int):Int = {
  1.to(n).flatMap(digits).count(_ == k)
}