需要帮助以了解递归示例

时间:2020-01-16 15:41:52

标签: javascript algorithm recursion

我试图理解一个用JavaScript编写的示例。实际上,我正在阅读 Eloquent JavaScript 这本书,但在阅读有关递归的主题时却陷入困境。

这是该示例的语句:

从数字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 个答案:

答案 0 :(得分:0)

递归函数将自行调用,直到分支满足不自行调用的条件为止。

在这种情况下,当当前值等于或大于初始目标值时,链停止。

但是我认为当电流等于目标值时,它应该返回null。

使用一些额外的日志记录,可以更好地跟踪发生的情况。

在下面的代码段中,当达到目标11时,它以null退出。
并且由于结果为空,因此将其乘以3得到最终解。

function findSolution(target) {

  function find(current, step, action) {
    console.log('step: '+step, '\taction: '+action, '\tcurrent: '+current);
    step++;
    if (current == target) {
       console.log(current+'='+target+' so exit with null')
       return null;
    } else if (current > target) {
       return current;
    } else {
      return find(current + 5, step, '+ 5') || find(current * 3, step, '* 3');
    }
  }

  return find(1, 0, 'start');
}

console.log(findSolution(11));