Kotlin 尾递归函数

函数式编程中,重要的概念 尾递归

当一个函数 在最后调用 自身,称为 尾递归,是一种特殊的递归函数。

Kotlin 使用 tailrec 声明尾递归函数,可以避免 StackOverflowError 的风险。

原理是:通过编译器优化 为 循环GOTO 跳转,代替 原来递归调用。

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

举例

计算 1 ~ N 的数之和。

kotlin 复制代码
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

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

文档

相关推荐
开发者工具分享23 分钟前
如何应对敏捷转型中的团队阻力
开发语言
gregmankiw29 分钟前
C#调用Rust动态链接库DLL的案例
开发语言·rust·c#
roman_日积跬步-终至千里44 分钟前
【Go语言基础【20】】Go的包与工程
开发语言·后端·golang
秦少游在淮海1 小时前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用
const5441 小时前
cpp自学 day2(—>运算符)
开发语言·c++
心扬1 小时前
python生成器
开发语言·python
duwei_wang1 小时前
[Android]-Admob配置过多导致的慢消息
android
阿蒙Amon1 小时前
06. C#入门系列【自定义类型】:从青铜到王者的进阶之路
开发语言·c#
虾球xz1 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
CodeWithMe2 小时前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++