Kotlin - 递归函数

Kotlin - 递归函数 首页 / Kotlin入门教程 / Kotlin - 递归函数

递归函数是一个连续调用自身的函数。这种技术称为递归。

递归函数

语法

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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

Kafka核心技术与实战 -〔胡夕〕

TypeScript开发实战 -〔梁宵〕

人人都用得上的写作课 -〔涵柏〕

实用密码学 -〔范学雷〕

MySQL 必知必会 -〔朱晓峰〕

eBPF核心技术与实战 -〔倪朋飞〕

现代React Web开发实战 -〔宋一玮〕

JavaScript进阶实战课 -〔石川〕

Dubbo源码剖析与实战 -〔何辉〕

好记忆不如烂笔头。留下您的足迹吧 :)