麻烦的递归函数

时间:2017-05-29 05:47:12

标签: javascript algorithm

任何人都可以向我解释这个吗?我无法理解在函数中使用函数的概念。

function factorialize(num) {
  if (num === 0) { 
    return 1; 
  }

  return num * factorialize(num-1);
}

factorialize(10);

这不是一个循环吗?为什么函数会连续调用自身?怎么知道什么时候停止?它不会继续将负数归因于无穷大吗?

一如既往地感谢帮助和指导。

5 个答案:

答案 0 :(得分:0)

递归是一种通过让函数自身重复调用直到它到达结果来迭代操作的技术。你可以阅读它here

答案 1 :(得分:0)

让我们想象一下:

SavedModel

希望这有帮助!

答案 2 :(得分:0)

每次功能" factorialize"运行你的论点" num"得到减少 1.所以num将从10运行到1,当返回1时,它将到达它的终端案例0.它只是终端,因为你的"如果"子句(你的基本情况)当num === 0时,你返回1,你的递归" factorizlize"永远不会到达,所以它永远不会被执行。

我对类比并不是很好。但是,如果它仍然没有意义让我知道。

答案 3 :(得分:0)

  

这不是一个循环吗?

不,不是。它是一个递归函数,一个在满足某个条件之前调用自身的函数。在这种情况下,是num等于0。

  

为什么函数会连续调用自己?

因为在该函数的返回值中调用了该函数。它将继续调用函数本身,直到num等于0.在这种情况下,函数将退出并返回1.

  

它如何知道何时停止?

条件if (num === 0)。如果num isn等于0,则变量num将被减去,如代码return num * factorialize(num-1);中所述。请注意,该函数返回新函数调用,但参数为num - 1。当num变为0时,该函数返回1.

  

它不会继续将负数归因于   无穷大?

因为我们有这个if (num === 0)条件。因此,每次调用代码numreturn num * factorialize(num-1);参数都会减少,最终会满足上述条件并退出函数。

我们可以一步一步地分解它:

  1. factorialize(10)被调用。
  2. num不是10,所以返回num * factorialize(num - 1)。在这种情况下,num是10而num-1是9,所以我们实际上返回以下内容:10 * factorialize(10 - 1)
  3. factorialize(9)被调用,然后重复步骤(1)和(2)直到你得到factorialize(0)。
  4. 当你达到factorialize(0)时,它将返回1.所以整个函数有效地返回10 * 9 * 8 * ... 1 * 1.
  5. 有道理吗?

答案 4 :(得分:0)

每个迭代问题都可以通过使用递归来解决。试着看看这段代码



var start = 1;
var end = 10;
var increment = 1;
document.write("loop output: ")
for(var num = start; num <= end; num = num + increment){
	document.write(num);
        document.write(" ");
}
document.write("\n function output:\n")

  function iteration(num) {

     //stop condition statement
     if (num > end) { 
        return 1; 
      }

      // inside code block
      	document.write(num);
        document.write(" ");

      //incremention
      	iteration(num+increment);
    }
iteration(start);
&#13;
&#13;
&#13;

它使用内部功能帧堆栈进行递归。有关递归的更多信息,请查看here。小练习需要理解这个概念。希望有意义。快乐的编码!