package kotlinall.chapter5
//尾递归
//递归的一种形式
//调用自身后无其他操作
//tailrec 关键字提示编译器进行尾递归优化
data class ListNode(val value:Int,var next:ListNode? = null)
tailrec fun findListNode(head:ListNode?,value: Int):ListNode?{//对于伪递归的操作 加上关键字 tailrec 编译器可以转成循环操作
head ?: return null
if(head.value == value) return head
return findListNode(head.next,value)
}//伪递归 链表查找
tailrec fun factorial(n:Long):Long{//非伪递归函数 虽然标记为伪递归 但是编译器会有提示
return n* factorial(n-1)//这里因为函数外部有 n*所以不是尾递归
}
data class TreeNode(val value:Int){
var left:TreeNode?=null
var right:TreeNode?=null
}
tailrec 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<String>) {
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)//如果去掉伪递归优化 则会stackoverflow
}
kotlin 尾递归优化
最新推荐文章于 2022-02-27 21:32:23 发布