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 错误

文档

相关推荐
2603_965148112 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya3 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的3 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务3 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
打工仔折腾 AI5 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问5 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5955 小时前
Python跳动的爱心②
开发语言·python·数学建模
小羊没烦恼!6 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
爱吃香菜的初学者6 小时前
十六.Linux——多线程(2)
linux·运维·开发语言
mmsx6 小时前
Android 插件化架构:40 个 Gradle 模块的拆分、通信与共存
android·kotlin