首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归将数字化成实例

使用递归将数字化成实例
EN

Stack Overflow用户
提问于 2018-07-19 22:27:17
回答 2查看 97关注 0票数 1

我试图理解递归,并发现下面的答案是一个免费的freecodecamp递归练习,以因式化一个数字。这是正确的,但我不明白它是如何运行的。

  • -If‘返回1’退出函数,那么输出不应该是1吗?
  • -The想要的模式有10x9x8x7等等,但是如果它每次都调用自己,这不是遵循模式10x9、9x8、8x7等等吗?

抱歉,如果这不是一个合适的问题,第一次使用。

代码语言:javascript
复制
function factorialize(num) {
  if (num === 0) { return 1; }
  return num * factorialize(num-1);
}

factorialize(5);
>120
EN

回答 2

Stack Overflow用户

发布于 2018-07-19 22:49:22

由于递归函数的单个结果是累积的,因此可以通过以下方式来想象这个过程:

  1. 调用阶乘(5);
  2. 第一个递归步骤返回-> 5* factorialize(4)当前值:5* factorialize(4)
  3. 第二个递归步骤返回-> 4* factorialize(3)当前值:5*4*阶乘(3)
  4. 第三个递归步骤返回-> 3* factorialize(2)当前值:5*4*3*阶乘(2)
  5. 第四个递归步骤返回-> 2* factorialize(1)当前值:5*4*3*2*阶乘(1)
  6. 第六递归步骤返回-> 1* factorialize(0)当前值:5*4*3*2*1* factorialize(0)
  7. 第七(最后)递归步骤返回-> 1当前值:5*4*3*2*1*1

这导致120人死亡。

代码语言:javascript
复制
function factorialize(num) {
  if (num === 0) { return 1; }      // 7th step
  return num * factorialize(num-1); // 1st to 6th step
}
票数 5
EN

Stack Overflow用户

发布于 2018-07-19 23:18:29

迭代编写函数可能有助于澄清问题;循环中的每个步骤都相当于一个递归调用。

代码语言:javascript
复制
function factorialize(num) {
  let factorial = 1; // base case, equivalent to fact(0)

  for (let i = 1; i <= num; i++) { // multiply for each number from 1 to n
    factorial *= i;
  }

  return factorial;
}

console.log(factorialize(5));

递归函数的工作方式是相同的。fact(n)是最初的调用,但是要计算fact(n),它必须首先计算n - 1的阶乘。没有fact(n - 1)就无法计算fact(n - 2)。每个函数都被推到调用堆栈上,等待上面的函数解析。最终将调用fact(0),我们知道这是基于阶乘的递归定义1fact(0)被称为基本情况,不会进行任何递归调用。如果没有基本情况,n会变得越来越小,直到堆栈耗尽空间,导致程序崩溃。

fact(1)现在可以使用来自大小写的信息计算1 * 1并将结果1传递给其调用函数fact(2)fact(2)计算2 * 1并将结果传递给fact(3)fact(3)计算3 * 2并将结果传递给fact(4)fact(4)计算4 * 6并将结果传递给fact(5)fact(5)计算5 * 24并返回120的最终结果。

如果这仍然没有意义,那么抛出一个console.log()来查看整个过程中的每一步:

代码语言:javascript
复制
function factorialize(num) {
  if (num === 0) { // base case 
    console.log("fact(0) returning 1");
    return 1; 
  }

  // recursive case
  const result = num * factorialize(num - 1);
  console.log("fact(" + num + ") returning " + result);
  return result;
}

console.log(factorialize(5));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51432544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档