Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript函数“返回”值?_Javascript_Algorithm_Recursion_Return - Fatal编程技术网

JavaScript函数“返回”值?

JavaScript函数“返回”值?,javascript,algorithm,recursion,return,Javascript,Algorithm,Recursion,Return,有人能给我解释一下为什么下面递归函数的最终返回值是正确的吗 function(factorial) { if (n == 0) return 1; return n * factorial (n -1); } 我理解递归,但我不明白为什么返回值是正确的结果,而不是仅仅1。。如果我将返回值改为2,那么它只是将阶乘的结果加倍。看来我在返回表达式中输入的任何值都会成为阶乘函数累积结果的乘数。为什么会这样?阶乘函数的累积结果是如何存储的?所有函数都会绘制一个堆栈“先进先出”结构,并查看每

有人能给我解释一下为什么下面递归函数的最终返回值是正确的吗

function(factorial) {
  if (n == 0) 
    return 1;
return n * factorial (n -1);
}

我理解递归,但我不明白为什么返回值是正确的结果,而不是仅仅1。。如果我将返回值改为2,那么它只是将阶乘的结果加倍。看来我在返回表达式中输入的任何值都会成为阶乘函数累积结果的乘数。为什么会这样?阶乘函数的累积结果是如何存储的?所有函数都会绘制一个堆栈“先进先出”结构,并查看每次函数的执行及其返回值。执行每个步骤后,从中弹出块。现在您可以看到以前调用的块返回到当前调用的块的值

注意:这里的block只不过是递归函数。

只需像这样运行这个方法

function factorial (n) { //line 1
  if (n == 0) //line 2
    return 1;//line 3
return n * factorial (n -1);//line 4
}
假设n=3,并且正在调用factorial3,它将对factorialn进行4次递归函数调用

递归1 n=3,第2行条件失败,因此它转到第4行并返回3*factorial2

递归2 n=2,第2行条件失败,因此它转到第4行并返回2*factorial1

递归3 n=1,第2行条件失败,因此它转到第4行并返回1*factorial0

递归4 n=0,第2行条件现在成功,因此它转到第3行并返回1。现在它将返回到递归3中的函数调用,并将1*factorial0替换为1*1,当返回到第一个递归调用并返回单个值时,它将最终返回3*2*1*1

这意味着如果你在第2行返回2,那么所有的东西都乘以2


是不是很简单:

将输入想象成5。然后第一次函数调用的最终结果如下:

根据@gurvinder372的评论进行编辑:

return 5*(return 4 * ( return 3 * (return 2 * ( return 1 * ( return 1)))))
你可以简单地展开一个阶乘5

阶乘5 factorial5=5*factorial4 factorial5=5*4*factorial3 factorial5=5*4*3*factorial2 factorial5=5*4*3*2*factorial1 factorial5=5*4*3*2*1*factorial0 阶乘5=5*4*3*2*1*1
谢谢你们所有的回答,伙计们——佛罗加托斯的回答可能是真正提高我理解力的答案

factorial(5)
factorial(5) = 5 * factorial(4)
factorial(5) = 5 * 4 * factorial(3)
factorial(5) = 5 * 4 * 3 * factorial(2)
factorial(5) = 5 * 4 * 3 * 2 * factorial(1)
factorial(5) = 5 * 4 * 3 * 2 * 1 * factorial(0)
factorial(5) = 5 * 4 * 3 * 2 * 1 * 1

干杯

从您的评论来看,您似乎真的不理解递归。好好想想。如果输入3会发生什么?提示:它将返回3*2*1,因为它是返回3*2*factorial2,这是返回3*2*factorial1,它不应该是返回5*return 4*return 3*return 2*return 1*return 1,因为OP也在检查n=0?谢谢Frogato-你展开的factorial和上面的答案真的很有帮助!