Kotlin 尾递归函数

发布时间:2024年01月21日

函数式编程中,重要的概念 尾递归
当一个函数,在函数最后调用 自身,称为 尾递归,是一种特殊的递归函数。

在JVM中,每次方法调用时,都会产生新的栈帧(stack frame),消耗栈内存。当 调用层级过多时,就会产生 StackOverflowError 错误。

尾递归函数 可以避免 StackOverflowError 的风险。原理是:
通过编译器优化 为 循环GOTO跳转,代替 原来递归调用。

Kotlin 使用 tailrec 声明尾递归函数。

举例

计算 1 ~ N 的数之和。

tailrec fun sum(top: Long, initValue: Long): Long {
    return if (top <= 0) {
        initValue
    } else {
        sum(top - 1, initValue + top)
    }
}

fun main(args: Array<String>) {
    // 计算 100万 数字累加之和
    println("sum: ${sum(1_000_000L, 0)}")
}

说明:

1. idea 查看 编译代码,Show Kotlin Bytecode -> Decompile

尾递归优化成while循环

2. 尝试把 tailrec 去掉,运行会 java.lang.StackOverflowError 错误

文档

文章来源:https://blog.csdn.net/w709835509/article/details/135724237
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。