在之前的文章中,或多或少的介绍过函数的一些基本概念,这里不想再重头讲,只说一些之前没遇到过的。
中缀符号
关键字:infix
infix fun Int.getMin(x: Int): Int {
val result = if (this > x) x else this
return result
}
fun main(args: Array<String>) {
val a: Int = 2
println(a getMin 3)
println(a.getMin(3))
}
表达式函数
fun double(x: Int): Int = x * 2
因为函数返回表达式,可以省略大括号。
局部函数
fun testDoctorq(name: String) {
println("Outer Fun $name")
fun testDoctorq(name: String, age: Int) {
println("Inner Fun $name")
}
testDoctorq(name, 28)
}
fun main(args: Array<String>) {
testDoctorq("doctorq")
}
尾递归函数
在需要递归的地方,使用循环解决,防止堆栈溢出。
关键字:tailrec
tailrec fun findFixPoint(x: Double = 1.0): Double
= if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))
实际执行的是如下代码:
private fun findFixPoint(): Double {
var x = 1.0
while (true) {
val y = Math.cos(x)
if ( x == y ) return y
x = y
}
}
定义尾递归函数要注意的地方是,最后一个操作必须调用自己。而且递归调用代码后面不能再有其他操作。