Javascript 递归减法

标签 javascript

示例 1

function x(num) {
  if (num == 0) {
   return 1;
  }
  else {
   return (num * x(num - 1));
 }
}

x(8);

8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

结果为 40320 符合预期

示例 2

function x(num) {
  if (num == 0) {
   return 0;
  }
  else {
   return (num + x(num - 1));
 }
}

x(8);

8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0

结果为 36 正如预期

示例3

function x(num) {
  if (num == 0) {
   return 0;
  }
  else {
   return (num - x(num - 1));
 }
}

x(8);

8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0

结果是4

有人能解释一下为什么吗?

答案不应该是-20吗?

最佳答案

您的函数的计算基本上是从右到左:

  8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
= 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1
= 8 - 7 - 6 - 5 - 4 - 3 - 1
= 8 - 7 - 6 - 5 - 4 - 2
= 8 - 7 - 6 - 5 - 2
= 8 - 7 - 6 - 3
= 8 - 7 - 3
= 8 - 4
= 4

这是因为每次递归调用函数x时,都会尝试计算最右边的表达式。

实际上,“堆栈”看起来像这样:

  8 - x(8 - 1)
= 8 - (7 - x(7 - 1))
= 8 - (7 - (6 - x(6 - 1)))
= 8 - (7 - (6 - (5 - x(5 - 1))))
= 8 - (7 - (6 - (5 - (4 - x(4 - 1)))))
= 8 - (7 - (6 - (5 - (4 - (3 - x(3 - 1))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - x(2 - 1)))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - (1 - x(1 - 1))))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - (1 - 0)))))))
= 8 - (7 - (6 - (5 - (4 - (3 - (2 - 1))))))
= 8 - (7 - (6 - (5 - (4 - (3 - 1)))))
= 8 - (7 - (6 - (5 - (4 - 2))))
= 8 - (7 - (6 - (5 - 2)))
= 8 - (7 - (6 - 3))
= 8 - (7 - 3)
= 8 - 4
= 4

JavaScript 对“纯”减法的评估是:

8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0; // -20

关于Javascript 递归减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32999214/

相关文章:

javascript - 为什么这个程序在返回null之后还继续运行呢?

javascript - 删除 Javascript 中的所有多个空格并替换为单个空格

javascript - 是否可以通过 onclick javascript 添加 dropzone 表单

javascript - 如何解决升级陀螺仪时出现 "incomplete keychange"错误

javascript - 用于将 2D 多边形横截面转换为 1D 几何图形的工具或库?

javascript - Require.js 错误 : Load timeout for modules: backbone,

javascript - 如何使用 html 视频标签在 react.js 中播放视频?

javascript - 使用 jQuery 按值选择具有子元素的元素

javascript - d3.partition 冰柱图的层次结构级别标签

javascript - CSV 解析器文档