Kotlin 尾递归
在传统的递归调用中,我们首先执行递归调用,然后我们获取递归调用的返回值并计算结果。但是在尾递归中,我们先执行计算,然后执行递归调用,将当前步骤的结果传递给下一个递归调用。最后,递归和尾递归都给出相同的输出。尾递归必须遵循的规则是递归调用应该是方法的最后一次调用。
使用尾递归的好处——
- 在尾递归中,函数调用是函数函数没有任何内容要执行。因此,无需将当前函数调用保存在堆栈内存中,编译器可以重新使用该堆栈空间进行下一次递归调用。
- 在尾递归中,我们不会在程序执行过程中得到StackOverflowError 。
示例 1:使用尾递归查找数字的阶乘。
Kotlin
// Kotlin program of factorial using tail-recursion
fun Fact(num: Int, x:Int):Long{
return if(num==1) // terminate condition
x.toLong()
else
Fact(num-1,x*num) //tail recursion
}
fun main() {
var n = 1
var result = Fact(5,n)
println("Factorial of 5 is: $result")
}
Kotlin
// two parameters passed an array and size of array
fun sum(args: Array , index:Int, s : Int = 0 ):Int{
return if(index<=0) s
else sum(args ,index-1, s + args[index-1]) // tail-recursion
}
fun main() {
// array initialization
val array = arrayOf(1,2,3,4,5,6,7,8,9,10)
// size of array
val n = array.size
val result = sum(array,n) // normal function call
println("The sum of array elements is: $result")
}
输出:
Factorial of 5 is: 120
上述程序的工作 -示例 2:使用尾递归查找数组元素的总和
科特林
// two parameters passed an array and size of array
fun sum(args: Array , index:Int, s : Int = 0 ):Int{
return if(index<=0) s
else sum(args ,index-1, s + args[index-1]) // tail-recursion
}
fun main() {
// array initialization
val array = arrayOf(1,2,3,4,5,6,7,8,9,10)
// size of array
val n = array.size
val result = sum(array,n) // normal function call
println("The sum of array elements is: $result")
}
输出:
The sum of array elements is: 55
说明:在这里,我们将数组作为参数以及 sum()函数中的其他两个参数传递。 (s) 参数的默认值等于零。我们正在计算每个递归调用的元素总和,从数组的最后一个索引开始。通过最后一次递归调用,我们将获得s中所有元素的总和,并在条件满足时返回它。