javascript - Eloquent JavaScript ch5 - "Your own loop"解决方案(循环与递归)

标签 javascript loops recursion

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

任务:

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

定义函数时,您可以使用常规循环来执行实际循环。

我没有使用循环。

图书解决方案

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

我是否只是让控制台输出相同的内容,或者我的解决方案会在真实环境程序中执行相同的操作吗?

我问,因为我不确定我是否真的用递归解决了它,或者只是让控制台输出相同的东西。这将帮助我 self 感觉更好,因为我是一名 JS 新手。谢谢! :)

最佳答案

是的,这是该任务的正确递归实现。您并非偶然获得了正确的输出。

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);
}

关于javascript - Eloquent JavaScript ch5 - "Your own loop"解决方案(循环与递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49267890/

相关文章:

javascript - 通过 JQuery 获取动态内容的 ID

javascript - 使用垂直框的 Twitter 关注者计数

javascript - 分配从对象列表生成的标签值列表

java - 这个设计有什么问题导致无限循环?

javascript - 使用 javascript 启用/禁用复选框时出现问题

javascript - Underscore.js findWhere 嵌套对象

php - 在 PHP 中循环遍历这个数组的最佳方法是什么?

python - 叠瓦循环和 Python 语法

algorithm - 当给定节点的二叉树时,如何编写返回节点链表的递归函数?

java - 通过 scala 处理深度优先迭代时出现 stackoverflowerror