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) {
    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)