37. 尾递归

作者: 厚土火焱 | 来源:发表于2017-11-27 22:01 被阅读85次

    当编程中使用到递归的时候,由于栈的原因,超出一定的递归次数,经常会出现栈被用完的错误(栈溢出stack overflow)。在 kotlin 编码中,我们可以使用优化尾递归为迭代的方式,提升编译器运算的能力。
    看一下下面这段代码

    fun main(args: Array<String>) {
        println(node(100000))
    }
    
    fun node(i: Int): Int {
        if (i % 27 == 0) {
            println(i.toString())
        }
        if (i == 0) return -1
        return node(i-1)
    }
    

    运行会报错


    栈溢出错误

    如果在 fun node(i:Int) 前加上一个 tailrec 修饰符,就可以正常运行到结束了。

    tailrec fun node(i: Int): Int {
        if (i % 27 == 0) {
            println(i.toString())
        }
        if (i == 0) return -1
        return node(i-1)
    }
    
    运行结果

    这就是尾递归的优化。
    如果不是尾递归,加上修饰符也没有作用。

    相关文章

      网友评论

        本文标题:37. 尾递归

        本文链接:https://www.haomeiwen.com/subject/mwhjbxtx.html