📜  Kotlin 尾递归

📅  最后修改于: 2022-05-13 01:55:21.708000             🧑  作者: Mango

Kotlin 尾递归

在传统的递归调用中,我们首先执行递归调用,然后我们获取递归调用的返回值并计算结果。但是在尾递归中,我们先执行计算,然后执行递归调用,将当前步骤的结果传递给下一个递归调用。最后,递归和尾递归都给出相同的输出。尾递归必须遵循的规则是递归调用应该是方法的最后一次调用。

使用尾递归的好处——

  1. 在尾递归中,函数调用是函数函数没有任何内容要执行。因此,无需将当前函数调用保存在堆栈内存中,编译器可以重新使用该堆栈空间进行下一次递归调用。
  2. 在尾递归中,我们不会在程序执行过程中得到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中所有元素的总和,并在条件满足时返回它。