《为什么js的递归,最终在递归函数完成后输出为什么是反向的》

643 阅读2分钟

为什么js的递归,最终在递归函数完成后输出为什么是反向的。

function fn (a) {
    
    console.log('在递归函数调用前的输出', a) // 5, 4, 3, 2, 1
    
    if (a === 0) {
        return
    } else {
    
        console.log('在递归函数调用前的输出', a) // 5, 4, 3, 2, 1
        
        fn (a - 1)
        
        console.log('在递归函数调用后的输出', a) // 1, 2, 3, 4, 5
    }
    
}

fn(5)

在js中,递归函数的执行过程是通过调用栈来进行的。

当一个函数被调用时,它会在调用栈的顶部创建一个新的帧(frame),并将其推入调用栈中。

函数执行期间,所有的局部变量和参数存储在该帧中。

函数返回时,该帧被弹出调用栈并将控制权返回上一帧


因此,递归函数的执行过程可以看作是将一系列嵌套的函数调用推入调用栈,然后依次弹出执行。

在递归函数的执行过程中,由于每次调用函数时都会创建一个新的帧将其推入调用栈,所以调用栈中的帧会呈现出一种“方向”的形式,即最开始的调用会在调用栈的底部,而最后的调用会在调用栈的顶部


像上面👆这个例子。

当我们调用fn(5)时,它会被推入调用栈中,它会被推入调用栈中,并在调用栈的顶部创建一个新的帧。

然后它会再次调用fn函数,并传入参数a - 1(也就是4)。

这个新的调用会被推入调用栈中,并在调用栈的顶部创建一个新的帧。

这个过程一直进行,直到n的值变为0,然后每个调用都会返回1,并从调用栈中弹出。


在这个过程中,我们可以看到调用栈的形式是一个向下的“倒三角形”,即最开始的调用fn(5)在调用栈的底部,而最后的调用fn(0)在调用栈的最顶部。因此,递归函数的最后输出呈现出的是"方向"的形式。


综上所述,递归函数的"方向"形式是由于调用栈的顺序所决定的,每次调用都会在调用栈的顶部创建一个新的帧,并将其推入调用栈中

当函数返回时,该帧会从调用栈中弹出,控制权返回到上一帧,直到最后一个帧被弹出为止。


配图在这里:

image.png

希望能有所帮助。

最好的学习是贡献和输出。

本文正在参加「金石计划」