gpt4 book ai didi

javascript - 如何用递归函数替换while?

转载 作者:行者123 更新时间:2023-11-30 11:33:12 28 4
gpt4 key购买 nike

我正在以这种方式使用 while:

while (value < -180 || value > 180) {
if (value < -180) {
value += 360
}
if (value > 180) {
value -= 360
}
}

不过,我想使用递归函数而不是 while。我在 Google 上搜索但找不到 find任何事物。所以我想也许我可以在这里得到答案。

最佳答案

将显式循环转换为递归解决方案的“通用公式”是:

  • 找出循环的“累加器”是什么。通常,循环会处理一两个值,而这些值就是循环的“结果”。

  • 使累加器成为函数的参数。

很难概括如何用递归替换任何旧循环,但这可以用作一般准则:

对于具有以下形式的循环:

var a, b, c = ...;

while (condition) {
// Change a, b, c...
}

// Use a, b, c

您可以将其转换为:

function recursive(a, b, c...) {
// When the condition does *not* hold, end the recursion.
// Note that condition is negated relative to the while-loop.
if (!condition) {
// Base case.
return [a, b, c...];

} else {
// Change a, b, c...
// and recurse with the new values
return recursive(a', b', c'...);
}
}

对于您的示例,这看起来像:

function recur(value) {
if (value > -180 || value < 180) {
return value; // Base case

} else if (value < -180) {
return recur(value + 360);

} else {
return recur(value - 360);
}
}

在您期望再次循环的情况下,递归,但请记住您需要返回递归的结果。对于要结束循环的情况,返回累加器。请注意,每个执行分支都必须以返回结束。一旦您丢弃递归的结果(不返回它),数据就会丢失。

注意:

  • 正如我在评论中提到的,递归不是一把锤子,不应该随便砸在任何老问题上;特别是当语言没有针对它进行优化时。这对于小问题可能没问题,但在未来,您可能会发现当问题变得更大时,它会突然开始无处不在地导致 StackOverflows。

  • 在处理可变 数据时,递归会变得困难和困惑。如果您的累加器是可变的(列表、映射或任何其他非原始类型),您必须非常小心地设置所有内容。可以从递归的每个分支访问和更改相同的数据。如果您不小心,您的蓄能器将以非常难以调试的方式从您的下方被更换。如果你想走递归/函数路径,我鼓励你研究像 Immutable.js 这样的库,或者像 Clojurescript 这样几乎专门处理不可变结构的语言。 Clojurescript 编译成 JavaScript。

关于javascript - 如何用递归函数替换while?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497082/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com