📅  最后修改于: 2021-01-05 07:23:29             🧑  作者: Mango
递归函数是一个连续调用自身的函数。这种技术称为递归。
句法
fun functionName(){
.. .. ..
functionName() //calling same function
}
让我们看一个递归函数打印计数的例子。
var count = 0
fun rec(){
count++;
if(count<=5){
println("hello "+count);
rec();
}
}
fun main(args: Array) {
rec();
}
输出:
hello 1
hello 2
hello 3
hello 4
hello 5
让我们看一个递归函数计算数字阶乘的示例。
fun main(args: Array) {
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
在讨论尾递归之前,让我们尝试举一个使用常规(普通)递归计算nth(大100000)的和的示例。
让我们看一个使用普通(普通)递归计算第n个(大于100000的数字)总和的示例。
fun main(args: Array) {
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) {
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) {
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