Kotlin教程:递归函数

2020-04-2020:41:39编程语言入门到精通Comments1,477 views字数 2177阅读模式

递归函数是一个连续调用自身的函数。 这种技术称为递归。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

语法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

fun functionName(){    
    .. .. ..  
    functionName() //调用函数自身 
}
Kotlin

Kotlin递归函数示例1:有限次数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

下面来看看一个递归函数打印计数的例子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

var count = 0
fun rec(){
    count++;
    if(count<=5){
        println("count => "+count);
        rec();
    }
}
fun main(args: Array<String>) {
    rec();
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

count => 1
count => 2
count => 3
count => 4
count => 5

Kotlin递归函数示例2:阶乘数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

下面我们来看一个计算阶乘数的递归函数的例子。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

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)
    }
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

Factorial of 5 = 120

上述阶乘实例的工作过程 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

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

Kotlin尾递归

在讨论学习尾递归之前,先来尝试使用一般(正常)递归来计算第n个(上限数为100000)的总和。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

一般递归
下面来看使用一般(正常)递归计算第n个(上限数为100000)之和的示例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

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)  
    }  
}
Kotlin

执行上面示例代码,得到类似以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

.....
jdk7.jar;C:\Users\hema\.IdeaIC2018.3\config\plugins\Kotlin\kotlinc\lib\kotlin-stdlib-jdk8.jar" HelloWorldKt
Exception in thread "main" java.lang.StackOverflowError
    at HelloWorldKt.recursiveSum(HelloWorld.kt:9)
    at HelloWorldKt.recursiveSum(HelloWorld.kt:9)
    at HelloWorldKt.recursiveSum(HelloWorld.kt:9)
Shell

上面的示例抛出了“java.lang.StackOverflowError” 的异常。 这是因为编译器无法调用大量的递归函数调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

尾递归

尾递归是一种递归,它首先执行计算,然后进行递归调用。 当前步骤的结果被传递到下一个递归调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

尾递归遵循一个实现规则。 该规则如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

递归调用必须是方法的最后一次调用。 要将递归声明为尾递归,我们需要在递归函数之前使用tailrec修饰符。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

Kotlin尾递归示例1:计算n(100000)个整数之和
下面来看一个使用尾递归计算第n个(上限为100000)之和的示例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

fun main(args: Array<String>) {  
    var number = 100000.toLong()  
    var result = recursiveSum(number)  
    println("sum 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)  
    }  
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

sum of upto 100000 number = 5000050000

Kotlin尾递归示例2:计算数字阶乘文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

下面来看一个使用尾递归计算数字阶乘的示例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

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)  
    }  
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

Factorial of 4 = 24

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-recursion-function.html文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18263.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/18263.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定