首页 > 解决方案 > 无法理解这个递归示例

问题描述

所以在 Eloquent JavaScript 的第 3 章中有一个递归示例,它是这样的: 考虑这个难题:从数字 1 开始,反复加 5 或乘以 3,可以产生无限的数字集合。你将如何编写一个函数,给定一个数字,试图找到一个产生该数字的加法和乘法序列?

给定的代码是..

function findSolution(target) {
  function find(current, history) {
    if (current == target) {
      return history;
    } else if (current > target) {
      return null;
    } else {
      return find(current + 5, `(${history} + 5)`) ||
        find(current * 3, `(${history} * 3)`);
    }
  }
  return find(1, "1");
}

现在有几件事我不明白。就像我们第一次调用函数一样,它会返回什么?它会返回(1, "1")并忽略内部函数find吗?

示例中的当前历史是什么?我不记得分配他们的价值?

标签: javascriptfunctionrecursionmultiplicationaddition

解决方案


第一次调用findSolution()它将返回该函数最后一行的结果find(1, "1")。在这种情况下,“1”是历史记录,它是通过调用来设置的find。的值为current1,这是第一个参数find(1, "1")

要理解的重要一点是,您正在调用一个正在调用新定义的函数的函数find。该函数的结果将递归调用自身,这是留给读者(你)的练习。无论结果是什么,都将由findSolution.


推荐阅读