kotlin 尾递归优化

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值