如何有效地表达这个功能

1 c++

int f(int n, int mul) {
    if (abs(n)%mul == 0) return n;
    else return f(n - 1, mul);
}
Run Code Online (Sandbox Code Playgroud)

所以它向下舍入到下一个mul.但显然对n的大值不好.如何安全有效地表达?

Ulr*_*rdt 5

这相对简单,您只需在调整变量时评估变化的表达式,直到结果满足正确的条件:

while (abs(n) % mul != 0) --n;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 虽然这回答了你的问题,但代码仍然很糟糕,但原因各不相同:
    • 有数字的函数.而不是重新发明轮子,使用其中之一应该是第一个本能的方法.
    • abs()看起来很无辜,但如果你在二进制补码系统中给出最小的整数呢?根本没有绝对值可以表示为这样的整数.
    • 同样,递减n可能会下溢,导致未定义的行为(以及令人惊讶的结果).
    • 另外,如果mul不是积极的话怎么办?代码不以任何方式处理这种情况,而函数签名允许它.
    • 最后但并非最不重要的是,首先编写一个循环是愚蠢的.模运算将为您提供第一个操作数到第二个操作数的下一个倍数的距离!但请确保您了解这对负数如何有效.另外,如果modulo在与某些值一起使用时导致未定义的行为,我也不会感到惊讶.获得这99%的权利很容易,剩下的百分比很棘手.
  • 优化尾端递归的编译器可能会生成相同的代码,因此无法保证为您提供任何优势.