Kotlin 尾递归函数

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

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

文档

  • Tail recursive functions | Kotlin
  • Tail call

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP缓存(C++)

系统为每个 socket 创建了发送缓冲区和接收缓冲区&#xff0c;应用程序调用 send()/write()函数发送数据的 时候&#xff0c;内核把数据从应用进程拷贝 socket 的发送缓冲区中&#xff1b;应用程序调用 recv()/read()函数接收数据的时候&#xff0c;内核把数据从 socket 的接收…

C语言实现简单的扫雷游戏

目录 1 -> test.c 2 -> game.c 3 -> game.h 1 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu() {printf("************************************\n");printf("********* 1.play ********\n&quo…

【51单片机】动态数码管

0、前言 参考&#xff1a; 普中51单片机开发攻略–A2.pdf 1、数码管介绍 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 1.1 多位数码管简介 2、74HC245 和 74HC138 芯片介绍 2.1 74HC245 芯片简介 2.2 7…

Docker使用及部署python项目

一、准备项目 ​ 我写的是一个爬取某ppt网站的代码&#xff0c;就一个ppt1.py是爬虫&#xff0c;然后&#xff0c;ppts是存放下载的ppt的 二、准备requirement.txt文件 这个是需要哪些python库支持&#xff0c;写好 ​ 三、准备Dockerfile文件 需要一个名为Dockerfile的文件&…

HarmonyOS关于deps、external_deps的使用

在添加一个模块的时候&#xff0c;需要在BUILD.gn中声明它的依赖&#xff0c;为了便于后续处理部件间依赖关系&#xff0c;我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 如上图所示&#xff0c;主要分为部件内依赖&#xff08;图左&#xff09;…

Java设计模式-前言

大家好&#xff0c;我是馆长&#xff01;从今天开始馆长开始对java设计模式进行讲解和整理分享给大家。馆长会尽快的整理完成设计模式的所有内容和讲解代码。从多方面进行模式的详细说明&#xff0c;方便各位看官理解和易学。 软件设计模式的概念 软件设计模式&#xff08;Sof…

C++笔记之bool类型的隐式转换现象与应用

C++笔记之bool类型的隐式转换现象与应用 —— 《C++ Primer Plus》 文章目录 C++笔记之bool类型的隐式转换现象与应用1.C++中,有几种类型和表达式可以隐式转换为bool类型2.使用explicit关键字来声明显示转换运算符,这样只有在使用static_cast<bool>时才能将对象转换为…

MySQL之索引结构

索引概述 索引是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些数据结构上实现…

00-Rust前言

问&#xff1a;为什么要近期想学习Rust? 答&#xff1a; Rust出来也是有一段时间了&#xff0c;从Microsoft吵着要重构他们的C"祖传代码"开始&#xff0c;Rust就披着“高效&#xff0c;安全”的头衔。而自己决定要学习Rust&#xff0c;是因为近期发现&#xff1a;涉…

linux驱动(八):block,net

本文主要探讨210的block驱动和net驱动。 block 随机存取设备且读写是按块进行,缓冲区用于暂存数据,达条件后一次性写入设备或读到缓冲区 块设备与字符设备:同一设备支持块和字符访问策略,块设备驱动层支持缓冲区,字符设备驱动层没有缓冲 块设备单位:扇…

【iOS】UICollectionView使用

使用UITableView作为表格来展示数据完全没有问题&#xff0c;但仍有许多局限性&#xff0c;对于一些更加复杂的布局样式&#xff0c;就有些力不从心了 比如&#xff0c;UITableView只允许表格每一行只能显示一个cell&#xff0c;而不能在一行中显示多个cell&#xff0c;对于这…

Java设计模式-原型模式(3)

大家好,我是馆长!从今天开始馆长开始对java设计模式的创建型模式中的单例模式、原型模式、工厂方法、抽象工厂、建造者的原型模式进行讲解和说明。 原型模式(Prototype Pattern) 定义 原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对…

【Android】app中阻塞的looper为什么可以响应touch事件

这里&#xff0c;我们考虑一个问题&#xff0c;Android中的应用是一个looper线程&#xff0c;没有任务时就阻塞着&#xff0c;其他线程通过handler调用等方式向主线程looper发送任务&#xff0c; 如果点击应用上的按钮&#xff0c;应用是怎么及时响应的呢&#xff0c; 是专门启…

阿里云国外服务器多少钱一个月?24元/月

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

记一次攻防实战全流程

如果我嚷几声&#xff0c;能叫醒那几个人&#xff0c;你就绝不能说他没有毁坏这铁屋的希望 DMZ区 1、信息收集 首先进行信息收集&#xff0c;使用Nmap对其进行扫描 端口服务&#xff1a;21、22、80、111、888、3306、8888&#xff0c;可以看到目标存在ftp、ssh、http等端口…

idea就改完内存启动不了怎么办

有时候在idea中修改完内存&#xff0c;再重启发现无法启动了&#xff0c;这个一般是设置的不太合理 导致的&#xff0c;接下来我来讲一下在idea之外设置运行内存的方式&#xff0c;以设置合理的运存来正常运行idea&#xff1a; 一、WinE 打开文件夹&#xff0c;进入c盘 二、按…

Python - 异常处理

前言 运行中的程序不知道怎么搞的报错了&#xff0c;恰好没有处理这个报错&#xff0c;程序也随之终止了&#xff0c;有没有什么办法能够让程序报错也能够不崩掉继续运行呢&#xff1f;答案是有的&#xff0c;就是通过异常处理。 什么是异常 异常顾名思义就是不正常&#xf…

记一次多平台免杀PHP木马的制作过程

注意&#xff1a;本文转载自本作者稀土掘金博客 博客地址&#xff1a; 御坂19008号 的个人主页 - 动态 - 掘金 文章目录 前言声明绕过情况使用方法运行环境绕过点介绍技术原理讲解变量传值覆盖模块代码执行阻断模块InazumaPuzzle程序锁定器PerlinNoise危险函数生成与执行类构造…

基于springboot+vue考编论坛

摘要 近年来&#xff0c;随着互联网的迅猛发展&#xff0c;编程论坛成为程序员们交流学术、分享经验的重要平台之一。为了满足广大程序员的需求&#xff0c;本文基于Spring Boot和Vue框架&#xff0c;设计并实现了一个功能强大的编程论坛。首先&#xff0c;我们选择Spring Boot…

Laya3.0 相机使用

摄像机&#xff0c;是3D场景里边最经常使用的对象了。 官方文档&#xff1a;点击这里学习 1.投影 Projection 透视&#xff1a; 模拟人眼的视觉效果&#xff0c;近大远小。模拟物理世界的规律&#xff0c;将眼睛或相机抽象成一个点&#xff0c;此时视锥体内的物体投影到视平…