
【29】kotlin 尾递归优化 tailrec
发布日期:2021-05-07 18:51:29
浏览次数:20
分类:精选文章
本文共 2902 字,大约阅读时间需要 9 分钟。
啥是尾递归
- 递归的一种形式
- 调用子身后无其他操作
- tailrec关键字提示编译器尾递归优化
- 尾递归与迭代的关系 tailrec就是让递归变成了迭代
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
看下 案列
package com.yzdzy.kotlin.chapter5import java.io.BufferedReaderimport java.io.FileReaderdata class ListNode(val value: Int, var next: ListNode?)//尾递归 就是函数调用自己之后直接返回 没有任何操作// 寻找链表头fun findListNode(head: ListNode?, value: Int): ListNode? { head ?: return null if (head.value == value) return head return findListNode(head.next, value)}//非尾递归// 函数尾部调用了其他的函数//阶乘fun factorial(n: Long): Long { return n * factorial(n - 1)}data class TreeNode(val value: Int) { var left: TreeNode? = null var right: TreeNode? = null}//非尾递归fun findTreeNode(root:TreeNode?,value: Int):TreeNode?{ root?:return null if(root.value==null) return root return findTreeNode(root.left,value)?:return findTreeNode(root.right,value)}
加上main案例测试下
package com.yzdzy.kotlin.chapter5import java.io.BufferedReaderimport java.io.FileReaderdata class ListNode(val value: Int, var next: ListNode? = null)//尾递归 就是函数调用自己之后直接返回 没有任何操作// 寻找链表头 fun findListNode(head: ListNode?, value: Int): ListNode? { head ?: return null if (head.value == value) return head return findListNode(head.next, value)}fun main(args: Array) { val MAX_NODE_COUNT = 10 val head = ListNode(0) var p = head for (i in 1..MAX_NODE_COUNT) { p.next = ListNode(i) p = p.next!! } //查找倒数第三个 println(findListNode(head, MAX_NODE_COUNT - 2)?.value)}
1w个元素呢
package com.yzdzy.kotlin.chapter5import java.io.BufferedReaderimport java.io.FileReaderdata class ListNode(val value: Int, var next: ListNode? = null)//尾递归 就是函数调用自己之后直接返回 没有任何操作// 寻找链表头 fun findListNode(head: ListNode?, value: Int): ListNode? { head ?: return null if (head.value == value) return head return findListNode(head.next, value)}fun main(args: Array) { val MAX_NODE_COUNT = 10000 val head = ListNode(0) var p = head for (i in 1..MAX_NODE_COUNT) { p.next = ListNode(i) p = p.next!! } //查找倒数第三个 println(findListNode(head, MAX_NODE_COUNT - 2)?.value)}
Exception in thread "main" java.lang.StackOverflowError
加上 tailrec 执行
package com.yzdzy.kotlin.chapter5import java.io.BufferedReaderimport java.io.FileReaderdata class ListNode(val value: Int, var next: ListNode? = null)//尾递归 就是函数调用自己之后直接返回 没有任何操作// 寻找链表头tailrec fun findListNode(head: ListNode?, value: Int): ListNode? { head ?: return null if (head.value == value) return head return findListNode(head.next, value)}fun main(args: Array) { val MAX_NODE_COUNT = 10000 val head = ListNode(0) var p = head for (i in 1..MAX_NODE_COUNT) { p.next = ListNode(i) p = p.next!! } //查找倒数第三个 println(findListNode(head, MAX_NODE_COUNT - 2)?.value)}
9998
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月03日 15时11分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
记一次讲故事机器人的开发-我有故事,让机器人来读
2021-05-09
vscode 编辑python 如何格式化
2021-05-09
seo 回忆录百度基本概念(一)
2021-05-09
用ThreadLocal来优化下代码吧
2021-05-09
netcore中使用session
2021-05-09
Android 开发学习进程0.25 自定义控件
2021-05-09
多媒体文件格式全解说(下)--图片
2021-05-09
淘宝WAP版小BUG分析
2021-05-09
NodeJS+Express+MongoDB
2021-05-09
(四十四)c#Winform自定义控件-水波-HZHControls
2021-05-09
c#winform主题实现的一个方法
2021-05-09
asp.net打印网页后自动关闭网页【无需插件】
2021-05-09
一个人开发的html整站源码分享网站就这么上线了
2021-05-09
SQLServer 查看耗时较多的SQL语句(转)
2021-05-09
【计算机网络】应用层
2021-05-09
【Maven】POM基本概念
2021-05-09
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2021-05-09
【设计模式】单例模式
2021-05-09
【Linux】2.3 Linux目录结构
2021-05-09