我正在实现阶乘函数作为编程练习的一部分。由于阶乘没有为负数定义,因此我为此添加了参数检查:
int factorial(int x)
{
if (x < 0) throw std::invalid_argument("Factorial of negative number is undefined");
if (x > 0) return (x * factorial(x - 1));
return 1;
}
参数检查实际上只需要为调用者执行一次,而不是在每次递归调用时执行。经过搜索后,我发现这可以通过将应该是递归一部分的代码包装在 lambda 中来完成:
int factorial(int x)
{
if (x < 0) throw std::invalid_argument("Factorial of negative number is undefined");
std::function<int(int)> calc;
calc = [&calc](int x) -> int
{
if (x > 0) return (x * calc(x - 1));
return 1;
};
return calc(x);
}
对于这么小的函数来说这确实不是问题。但假设该函数有一些非常昂贵的参数验证。像我在这里所做的那样,在递归部分使用 lambda 是一个好方法吗?这种场景下通常会使用什么方法?
通常应该使用循环而不是递归,因为以下几点:
示例:
int factorial(int x) {
if (x < 0) throw std::invalid_argument("Factorial of negative number is undefined");
int result = 1;
for (int i = 1; i <= x; ++i) {
result *= i;
}
return result;
}