【问题标题】:Need help to understand an example of recursion [duplicate]需要帮助来理解递归的例子[重复]
【发布时间】:2020-05-03 12:06:25
【问题描述】:

我试图理解一个用 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");
}

【问题讨论】:

  • 你有什么问题?
  • 具体有什么不明白的?您是否在调试器中逐步完成它或放入日志语句以了解正在发生的事情?还是用笔和纸“玩电脑”来单步执行代码?
  • 是的,实际上我只是想了解这段代码是如何手动在纸上工作的。
  • @ASDFGerte 或者它一定很受欢迎,以至于有很多人阅读它并提出问题。没有人对我写的解释提出问题,但这可能是因为我没有写任何流行的东西,而不是质量好的迹象。另一方面,阅读教科书的人仍然有问题以澄清他们的理解这一事实并不是对这本书的控诉;任何学习困难主题的人有时都需要就他们所阅读的内容提出问题。
  • “我希望作者将其视为改进的目标”,这将是一个富有成效的结果 :) 另一个结果是,我获得了信息,它确实是一本受欢迎的书,并且至少有一个声音说这很好。

标签: javascript algorithm recursion


【解决方案1】:

递归函数调用自身,直到分支满足不调用自身的条件。

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

但我认为当当前等于目标时它应该返回null。

通过一些额外的日志记录可以更好地跟踪发生的事情。

在下面的sn-p中,遇到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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 2017-03-31
    • 1970-01-01
    • 2023-03-23
    • 2020-07-04
    • 2021-11-29
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多