关于JS递归操作

function f(num){
    if(num<=1){
      return 1;
    }else{
      return num * arguments.callee(num-1);
    }
}

alert(f(5)); //120

这里为什么结果会是120  arguments.callee(num-1);callee指向的是f  
那么这个结果不应该是f(num-1) //5-1=4  
为什么执行的是5*4*3*2*1 呢 原理是什么

阅读 2.7k
3 个回答

因为是递归

当递归出口条件没达到会一直执行这个函数;

第一次是:5 x arguments.callee(4);

第二次是:5 x 4 x arguments.callee(3);

第三次是:5 x 4 x 3 x arguments.callee(2);

第四次是:5 x 4 x 3 x 2 x arguments.callee(1); //最后达到条件退出了

所以得到的结果是 5x4x3x2x1 = 120;

因为arguments.callee指向函数本身,因此上面的函数f等价于如下

function f(num){

    // 如果num小于等于1,则终止递归
    if(num<=1){
      return 1;
    }else{
    
      // 如果num比1大,则继续递归
      return num * f(num-1);
    }
}

// 执行f(5),其实就是进行了一个 5 * 4 * 3 * 2 * 1的运算
f(5);

因此最终的结果自然是120了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题