递归函数是一个连续调用自身的函数。这种技术称为递归。
语法
fun functionName(){ .. .. .. functionName() //调用自己 }
让无涯教程看一下递归函数打印计数的示例。
var count = 0 fun rec(){ count++; if(count<=5){ println("hello "+count); rec(); } } fun main(args: Array<String>) { rec(); }
输出:
hello 1 hello 2 hello 3 hello 4 hello 5
让无涯教程看一下递归函数计算数量的示例。
fun main(args: Array<String>) { val number = 5 val result: Long result = factorial(number) println("Factorial of $number = $result") } fun factorial(n: Int): Long { return if(n == 1){ n.toLong() } else{ n*factorial(n-1) } }
输出:
Factorial of 5 = 120
上述阶乘的工作过程示例
factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) return 1 return 2*1 = 2 return 3*2 = 6 return 4*6 = 24 return 5*24 = 120
在讨论尾递归之前,让无涯教程尝试举一个使用常规递归计算第n个(大于100000的数字)之和的示例。
让无涯教程看一个使用普通递归来计算第n个(大于100000的数字)之和的示例。
fun main(args: Array<String>) { var result = recursiveSum(100000) println(result) } fun recursiveSum(n: Long) : Long { return if (n <= 1) { n } else { n + recursiveSum(n - 1) } }
输出:
Exception in thread "main" java.lang.StackOverflowError
上面的示例抛出"java.lang.StackOverflowError"的例外。这是因为编译器无法调用大量递归函数调用。
尾递归是先执行计算然后进行递归调用的函数,当前步骤的结果将传递到下一个递归调用中。要将递归声明为尾递归,无涯教程需要在递归函数之前使用tailrec修饰符。
让无涯教程看一下使用尾递归计算第n个(100000较大数量)的总和的示例。
fun main(args: Array<String>) { var number = 100000.toLong() var result = recursiveSum(number) println("sun of upto $number number = $result") } tailrec fun recursiveSum(n: Long, semiresult: Long = 0) : Long { return if (n <= 0) { semiresult } else { recursiveSum( (n - 1), n+semiresult) } }
输出:
sun of upto 100000 number = 5000050000
让无涯教程看看使用尾递归计算数量的阶乘的一个例子。
fun main(args: Array<String>) { val number = 4 val result: Long result = factorial(number) println("Factorial of $number = $result") } tailrec fun factorial(n: Int, run: Int = 1): Long { return if (n == 1){ run.toLong() } else { factorial(n-1, run*n) } }
输出:
Factorial of 4 = 24
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)