1

在 ruby​​ 中,伪代码之间有什么区别,例如:

if n > 2:
   do something to A
end

if n > 4:
   do something to B
end

if n >25:
   do something to C
end

对比

if n>2 && n <4:
  do something to A
elif n >4 && n < 25:
  do something to A and do something to B
elif n > 25:
  do something to A and B and C
end

如您所见,它们做同样的事情,但如果您有很多if then语句,则更容易阅读和编写。但是,如果多个if块占用更多的处理能力,那么以这种方式编写它是不值得的。

因此我想知道两者之间是否有区别?概念性答案很好,我不需要对任何东西进行基准测试

4

4 回答 4

2

1/它们不等价。

第一条语句相当于

if n>2 && n <= 4:
  do something to A
elif n > 4 && n <= 25:
  do something to A
  do something to B
elif n > 25:
  do something to A
  do something to B
  do something to C
end

如果do something to A返回nilor false,您的第二条语句将不会执行do something to B

而且你忘了处理像n = 4and之类的极端情况n = 25

2/ 在 99.9% 的情况下,您应该选择更易于阅读/理解/调试的版本。除非此代码每秒运行 1000000 次,否则这无关紧要。正如您所看到的,您已经通过尝试过早地对其进行优化来创建 2 个潜在错误 :)

3/ 在性能方面,简短的回答是:这取决于你的数据。

长答案是:您必须尝试预测n大多数情况下的范围。您可以只计算比较次数:

n < 2: 语句 1:3 次比较 - 语句 2:3 次比较

2 < n <= 4: 语句 1:3 次比较 - 语句 2:2 次比较

4 < n <= 25: 语句 1:3 次比较 - 语句 2:4 次比较

25 < n: 语句 1:3 次比较 - 语句 2:5 次比较

于 2013-03-27T22:49:13.150 回答
1

不,没有区别。这两个程序都将返回语法错误,并且不会运行。

于 2013-03-27T23:03:56.203 回答
0

假设您无法预测“最常见的路径”(例如,知道绝大多数情况下 n 在 2 和 4 之间),我怀疑第二种方法是否更有效;进行的比较次数将相似。

于 2013-03-27T22:34:22.397 回答
0

好吧,第一个选择减少了逻辑错误的可能性。在第二个选择中,如果n == 4或会发生什么n == 25?是的,你可以很容易地解决这个问题,但你必须认识到这种可能性。

我假设“做某事”伪代码块只是方法调用,所以你不会重复你的文本。这是一个很难回答的问题,因为这两种方法都不涉及嵌套的 if-else 子句。if 子句的成本差异很小,我不会考虑这一点,并且“做某事”块中的重复是相同的方式。但是,我可以想象一个更清晰的方法。A、B 和 C 是否都有类似 A.handle(n)、B.handle(n) 和 C.handle(n) 的方法,如果 n <= 2,第一个不执行任何操作,如果 n <= 2,则第二个不执行任何操作n <= 4,如果 n <= 25,第三个什么都不做?

于 2013-03-27T22:40:14.320 回答