使用 goto 是打破两个循环的合法方法吗?
我正在解决 Project Euler 上的问题 9。 在我的解决方案中,我使用“goto”语句来打破两个 for 循环。 问题如下:
毕达哥拉斯三元组是三个自然数 abc 的集合,其中,
a^2 + b^2 = c^2
例如,3^2 + 4^2 = 9 + 16 = 25 = 52。
存在一个毕达哥拉斯三元组,其中 a + b + c = 1000。 查找产品 abc。
我的解决方案是在c++中:
int a,b,c;
const int sum = 1000;
int result = -1;
for (a = 1; a<sum; a++){
for (b = 1; b < sum; b++){
c = sum-a-b;
if (a*a+b*b == c*c){
result = a*b*c;
goto found;
}
}
}
found:
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "c:" << c << std::endl;
std::cout <<"Result:" << result << std::endl;
由于“goto”语句在c++程序员中不太流行,我想知道这是否可以被认为是“goto”的合理使用。 或者是否有更好的解决方案来解决不需要“goto”的问题。 我的意思并不是指仅仅避免“goto”的解决方案,而是以改进算法的方式避免“goto”的解决方案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
return
是一个“结构化的”goto
,许多程序员认为它更容易接受! 所以:return
is a "structured"goto
which many programmers find more acceptable! So:在我看来,在这种情况下使用
goto
是可以的。顺便说一句,反对 goto 的居高临下的说教通常来自那些只是鹦鹉学舌地模仿他们听到别人说或读到的东西的人。
In my opinion it's fine to use
goto
in a situation like this.Btw, the condescending preaching against goto usually comes from people who just parrot what they heard others say or read somewhere..
请参阅此问题 关于打破 2 个循环。 提供了比使用 goto 更好的答案。
提供的最佳答案是将第二个循环放入一个函数中,然后从第一个循环内部调用该函数。
从 mquander 的回复中复制的代码
尽管我确实觉得在这种情况下使用 goto 并不像杀死小猫那么糟糕。 但已经很接近了。
See this question about breaking out of 2 loops. There are much better answers provided than using a goto.
The best answer provided is to place your second loop into a function, and call that function from inside your first loop.
code copied from mquander's response
Though I do feel that using a goto in this case isn't quite as bad as killing kittens. But it's close.
我想不出更好的选择。 但不使用 goto 的另一种选择是修改第一个 for 循环:
然后从第二个 for 循环中
break 出来-环形。 假设在第二个
for
循环被break
破坏后,结果永远不会是-1
,那么这将起作用。I can't think of a better alternative. But one alternative not using
goto
would be modifying the firstfor
-loop:Then
break
out of the secondfor
-loop. That will work assuming the result will never be-1
after the secondfor
-loop has been broken bybreak
.您可以在顶部声明一个
boolfound = false
,然后添加&& !found
到你的 for 循环条件(在a 和
b 之后),然后在你当前的 goto 位置将found 设置为 true。 然后使你的输出以发现为真为条件。
You could declare a
bool found = false
at the top and then add&& !found
to your for loop conditionals (aftera < sum
andb < sum
) and then set found to true where your current goto is. Then make your output conditional on found being true.还优化了结果..:P
无论如何我喜欢 gotos!
Also optimized result out.. :P
Anyway i love gotos!