无法理解这个递归示例

问题描述

所以在 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吗? >

以及示例中的当前历史是什么?我不记得给它们赋值?

解决方法

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

中的第一个参数

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