我第一次尝试时确实溢出了堆栈,但后来我在没有参数的情况下放置了 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/