一道关于递归的面试题

Posted on 2017-08-31 19:03  快乐的~小和尚  阅读(300)  评论(0编辑  收藏  举报
function abc(num){
  if(num>3){
    abc(--num);
  }
console.log(num)
}
abc(5)
 
先公布答案吧,输出结果是3,3,4
刚开始我也很诧异,后面终于想明白了,我把我的一些思路分享出来;
这道题主要考了大家对递归的理解,递归其实是有去有回的,进去了还要一步一步出来,最终完成递归,
咋们来分析下
第一步,当我们调用abc(5),创建了第一个abc的执行上下文,进入判断(num>3)条件成立,
第二步,调用了abc(--num),创建第二个abc的执行上下文,这时候num=4,进入(num>3)条件成立,
第三步,调用abc(--num),创建第三个abc的执行上下文,这时候num=3,进入(num>3)条件不成立,直接执行下一行代码输出num的值为3,代码结束,销毁这个上下文,注意了这个时候递完成了,就要归了,
 
回到第二步abc的上下文,此时的num已经执行了--num,所以等于3,那么执行输出语句当然是3了,代码执行完毕,销毁第二个abc上下文;
回到第一步abc的上下文,此时同理--num的原因,num=4,输出结果为4,代码执行完毕,销毁上下文.
递归函数到这里就算执行完了;