【问题标题】:Eloquent JavaScript ch5 - "Your own loop" solution (loop vs recursion)Eloquent JavaScript ch5 - “你自己的循环”解决方案(循环与递归)
【发布时间】:2018-08-22 09:37:27
【问题描述】:

我确实在第一次尝试时确实溢出了堆栈,但是我在没有参数的情况下放置了 return 语句(参见代码中的注释)并且它起作用了。

任务:

编写一个提供类似于 for 循环语句的高阶函数循环。它需要一个值、一个测试函数、一个更新函数和一个主体函数。每次迭代,它首先对当前循环值运行测试函数,如果返回 false,则停止。然后它调用 body 函数,给它当前值。最后,它调用更新函数创建一个新值,并从头开始。

在定义函数时,可以使用常规循环来进行实际的循环。

我没有使用循环。

图书解决方案

function loop(start, test, update, body) {
   for (let value = start; test(value); value = update(value)) {
     body(value);
   }
 }

 loop(3, n => n > 0, n => n - 1, console.log);
 // → 3
 // → 2
 // → 1

我的解决方案(保留我原来的函数参数名称)

function loop(value, test, update, execute){
  if (test(value)) execute(value);
  else return // prevents stack overflow?
  return loop(update(value),test,update,execute)


}
loop(3, n => n > 0, n => n - 1, console.log);
// → 3
// → 2
// → 1

我只是让控制台输出同样的事情,还是我的解决方案会在真实环境程序中做同样的事情?

我问,因为我不确定我是否真的用递归解决了它,或者只是让控制台输出相同的东西。这将帮助我对自己感觉更好,因为我是一个菜鸟 JS 学习者。谢谢! :)

【问题讨论】:

  • 我不明白您所说的“使控制台输出相同的东西”是什么意思。
  • 换句话说-我的解决方案是真正的解决方案,还是只是运气-正如您在其他评论中提到的那样。谢谢大佬,不胜感激!

标签: javascript loops recursion


【解决方案1】:

初始化器

书本解决方案创建一个value 变量并使用start 对其进行初始化。在您的情况下,这会在您传递第一个参数时自动发生。到目前为止,这两种方法是等价的。

测试

for 循环将test(value) 称为循环test。您的方法做了类似的事情,但调用test 是对递归的测试。到目前为止,这两种方法是等价的。

循环块

for 循环调用body(value)。您的方法调用execute(value)。到目前为止,这两种方法是等价的。

更新

value 在每次迭代后的循环中更新。当您在递归调用中传递 update(value) 时,您的代码中也会发生同样的情况。到目前为止,这两种方法是等价的。

它们真的是等价的吗?

从算法上讲,是的。从技术上讲,没有。您的递归方法多次调用function 并使用堆栈(内存)来存储function 调用。如果test 数量过多,您的代码将崩溃。因此,您已经成功实现了本书示例的递归版本(耶!),但在大多数情况下,您应该尽量避免递归。

【讨论】:

    【解决方案2】:

    是的,这是该任务的正确递归实现。你不是偶然打出正确的输出。

    else return 有点奇怪。我也会写的

    function loop(value, test, update, execute) {
      if (test(value)) {
        execute(value);
        return loop(update(value), test, update, execute);
      } // else stop
    }
    

    function loop(value, test, update, execute) {
      if (!test(value)) return; // stop
      execute(value);
      return loop(update(value), test, update, execute);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2011-02-09
      • 1970-01-01
      • 2021-03-15
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多