第九节 递归、迭代、尾递归

1、求n的阶乘
利用递归实现


fun main(args: Array) {

    val v=5
    println(fact(v))

}

fun fact(value:Int):Int{
    if(value==1)
    {
        return 1
    }
    else{
        return fact(value-1)*value
    }
}

输出:


第九节 递归、迭代、尾递归_第1张图片
image.png

2、利用迭代的方式
就是遍历相乘


fun main(args: Array) {

    val v=5
    println(iteration(v))

}

fun iteration(value:Int):Int{

    val range=1..value
    var result=1
    range.forEach {
        result*=it
    }
    return result
}

结果:


image.png

3、计算1到n的和
递归


fun main(args: Array) {

    val v=100000
    println(fact(v))

}

fun fact(value:Int):Int{
    if(value==1)
    {
        return 1
    }
    else{
        return fact(value-1)+value
    }
}

结果栈溢出


image.png

迭代呢:


fun main(args: Array) {

    val v=100000
    println(iteration(v))

}

fun iteration(value:Int):Long{

    val range=1..value
    var result=1L
    range.forEach {
        result+=it
    }
    return result
}

结果:


第九节 递归、迭代、尾递归_第2张图片
image.png

递归和迭代相比,有其局限性,层级不能太深,否则会栈溢出,但是递归实现起来思路比较简单,那么能不能对递归进行优化呢?可以的,就是先转化为尾递归,再加关键字(关键字tailrec)
3、尾递归(只有尾递归才能优化)
什么是尾递归呢?就是调用自身之后不再做其他操作
return fact(value-1)+value,这个代码就不是尾递归,因为调用了自身之后还执行了加操作
优化上面的递归

fun main(args: Array) {

    val v=100000
    println(tailFact(v))

}

tailrec fun tailFact(value:Int,result:Long=1L):Long{
    if(value==1)
    {
        return result+1
    }
    else{
        return tailFact(value-1,result+value)
    }
}

输出:


image.png

你可能感兴趣的:(第九节 递归、迭代、尾递归)