Kotlin尾递归优化
一、尾递归优化
1.递归的一种特殊形式
2.调用自身后无其他的操作
3.tailrec关键字提示编译器尾递归优化
二、具体的来看看一下代码说明
package net.println.kotlin.chapter5.tailrecursive/**
* @author:wangdong
* @description:
*//**定义一个节点的list的集合*/
data class ListNode(var value: Int, var next: ListNode ?= null)/**定义一个查找节点的方法*/
/**
* 简单的尾递归
* head可能为空
* ListNode可能为空
* 对尾递归做优化,只需要加一个关键字tailrec
*/
tailrec fun findListNode(head: ListNode ?,value: Int):ListNode ?{
//如果传进来的head为空,返回空
head ?: return null
//如果找到head,就返回head
if (head.value =https://www.it610.com/article/= 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
}/**定义一个查找的方法*/
/**
* 传入一个根节点root
* 传入要查找的值value
* 返回查找到的节点
*/
fun findTreeNode(root: TreeNode ?, value: Int):TreeNode?{
root ?: return null
if (root.value == value) return root
//这边调用了自己过后,又调用了一下自己,所以就不算是尾递归了
return findTreeNode(root.left,value) ?: return findTreeNode(root.right,value)
}fun main(args: Array) {
//递归节点数
val MAX_NODE_COUNT = 100000
//头部节点所在的位置
val head = ListNode(0)
var p = head
//写一个for循环
for (i in 1..MAX_NODE_COUNT){
p.next = ListNode(i)
p = p.next!!
}
//查找倒数第二个节点,找到了就把它的值打出来
println(findListNode(head,MAX_NODE_COUNT - 2) ?.value)//8
}
【Kotlin尾递归优化】好啦,结束啦
推荐阅读
- 六月更新的......
- 三生三世之凤尾花开第34章上神过招·连载
- android防止连续点击的简单实现(kotlin)
- 无尾鱼与独脚鸟
- retrofit2-kotlin-coroutines-adapter|retrofit2-kotlin-coroutines-adapter 超时引起的崩溃
- 胡乱解字
- Kotlin泛型的高级特性(六)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 风吹一季——写在大学的尾巴上
- 2019-04-30,4月的结尾