int f(int n, int mul) {
if (abs(n)%mul == 0) return n;
else return f(n - 1, mul);
}
因此它向下舍入到下一个 mul
。但显然不适用于较大的 n 值。如何安全高效地表达?
最佳答案
这相对简单,您只需在调整变量的同时计算变化的表达式,直到结果满足正确的条件:
while (abs(n) % mul != 0) --n;
注意事项:
- 虽然这回答了您的问题,但代码仍然有问题,但原因不同:
- 有一些函数可以对数字进行舍入。与其重新发明轮子,不如使用其中一个应该是第一个本能的方法。
abs()
看起来很无辜,但是如果您在二进制补码系统中给它一个可能的最小整数呢?根本没有绝对值可以表示为这样的整数。- 同样,递减
n
可能会下溢,导致未定义的行为(和令人惊讶的结果)。 - 此外,如果
mul
不是正数怎么办?代码不以任何方式处理这种情况,但函数签名允许这样做。 - 最后但同样重要的是,一开始就写一个循环是愚蠢的。模运算将为您提供第一个操作数与第二个操作数的下一个倍数的距离!不过,请确保您了解这是如何对负数起作用的。此外,如果模数在与某些值一起使用时导致未定义的行为,我也不会感到惊讶。正确完成这 99% 很容易,剩下的百分比很棘手。
- 优化尾端递归的编译器可能会生成相同的代码,因此不能保证它会给您带来任何优势。
关于c++ - 如何高效地表达这个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35811867/