LeetCode最小栈实现中this.stack.pop()为何不会触发递归调用
MinStack的pop方法不会触发递归的原因
核心逻辑非常简单:JavaScript中方法的调用主体是.前面对应的对象,只会在这个对象的原型链上查找目标方法,和其他对象的同名方法完全无关。
我们把这段代码的执行链路拆解开就一目了然:
- 当你创建MinStack实例时,实例上会挂载一个名为
stack的属性,它的值是一个原生数组,数组本身在原型上自带原生实现的pop()方法。 - 当你在外部调用MinStack实例的
pop()方法时(比如minStack.pop()),调用主体是MinStack实例,自然会执行类中定义的pop逻辑。 - 进入pop方法后执行
this.stack.pop()时,会先拿到this.stack对应的原生数组对象,后续的.pop()调用主体是这个数组,因此会直接执行数组的原生pop方法,根本不会绕回MinStack类定义的pop方法,自然不可能出现无限递归。
打个直白的比方:你自己会「开瓶盖」,你开瓶盖的流程是「拿起开瓶器,用开瓶器开瓶盖」,总不会因为你自己会开瓶盖,开瓶器执行开瓶盖动作的时候就会反复调用你自己的开瓶盖方法陷入死循环吧?本质就是两个不同对象的同名方法而已。
只有当你在MinStack的pop方法内直接写this.pop()时,调用主体才始终是MinStack实例本身,这时候才会反复触发自身方法,进入你担心的递归死循环。
你看到的代码片段只是最小栈pop逻辑的一部分,完整的常数时间最小栈实现会额外同步维护一个存储最小值的辅助栈,pop操作时同步弹出主栈和辅助栈的栈顶元素即可。
对应的代码片段:
class MinStack { stack = []; pop() { // 此处pop的调用主体是数组实例,和MinStack自身的pop方法无关 this.stack.pop(); } }
内容的提问来源于stack exchange,提问作者garfield the cat
相关产品推荐
相关产品推荐

