Kotlin中函数式编程API(8)求阶乘和计算水仙花数

  • 求阶乘
  • 计算水仙花数

  前面介绍了很多函数,下面两个需求使用前面的函数将变得简单清晰。

一、求阶乘

  求阶乘通常会使用递归函数调用,这比较影响性能,可以通过前面介绍的 reduce 函数实现。

fun factorial(n: Int): Int = if (n < 1)
    throw UnsupportedOperationException("n<1 can't be reduced.")
else
    (1..n).reduce { acc, i -> acc * i }

fun main(args: Array?) {
    try {
        println("1! = ${factorial(1)}")
        println("2! = ${factorial(2)}")
        println("5! = ${factorial(5)}")
        println("-10! = ${factorial(-10)}") // 1️⃣
    } catch (e: Exception) {
        println(e)
    }
}
// 输出结果

2019-06-14 10:42:23.157 I: 1! = 1
2019-06-14 10:42:23.157 I: 2! = 2
2019-06-14 10:42:23.157 I: 5! = 120
2019-06-14 10:42:23.158 I: java.lang.UnsupportedOperationException: n<1 can't be reduced.

  函数 factorial 对输入的参数做了一定的限制,防止用户输入不合法参数值,代码第1️⃣行传入非法参数 -10,这时会抛出异常 n<1 can't be reduced.,通过 try catch 捕获并打印异常信息。

二、计算水仙花数

  水仙花数是一个三位数,这个数的三个数位上的数 各自立方之和等于三位数本身。

fun narcissistic() = IntArray(1000) { it } // 初始化数据
    .filter { it > 99 } // 筛选出所有3位数
    .filter { // 各个数位的立方和等于本身
        val b = it / 100
        val s = (it - b * 100) / 10
        val g = it - b * 100 - s * 10
        b * b * b + s * s * s + g * g * g === it
    }.forEach { println(it) }

fun main(args: Array?) {
    narcissistic()
}
// 输出结果

2019-06-14 11:06:45.374 I: 153
2019-06-14 11:06:45.374 I: 370
2019-06-14 11:06:45.374 I: 371
2019-06-14 11:06:45.374 I: 407

你可能感兴趣的:(Kotlin中函数式编程API(8)求阶乘和计算水仙花数)