使用 lambda 将函数的递归部分与其余部分分开是一个好的做法吗?

问题描述 投票:0回答:1

我正在实现阶乘函数作为编程练习的一部分。由于阶乘没有为负数定义,因此我为此添加了参数检查:

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 是一个好方法吗?这种场景下通常会使用什么方法?

c++ recursion lambda
1个回答
0
投票

通常应该使用循环而不是递归,因为以下几点:

  • 每次递归调用都会消耗堆栈空间。如果您的函数必须在每次调用时分配大量内存,这可能会导致堆栈溢出
  • 此外,由于避免了 函数调用的开销 和堆栈操作,循环通常比递归执行得更好。

示例:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.