迭代或递归因子

时间:2015-01-28 11:54:21

标签: c++ algorithm recursion iteration

我以这种方式递归地实现了阶乘:

int factorial(int x){
    if (x <= 0)
        return 1;
    else
        return (x*factorial(x - 1));
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "Please enter your number :::";
    int x;
    std::cin >> x;
    std::cout<<"factorial(" << x << ") = "<< factorial(x);
    getchar(); getchar();
}

实现这样的代码的哪种方式更有用,可以使用迭代和循环来编写它,或者像上面那样递归地编写它?

2 个答案:

答案 0 :(得分:4)

这取决于数字本身。

对于正常范围的数字,可以使用递归解决方案。由于它使用以前的值来计算未来值,因此它可以动态提供'factorial(n-1)'的值。

factorial(n) = factorial(n-1) * n

但是,由于递归使用堆栈,如果计算深度超过堆栈大小,它将最终溢出。此外,递归解决方案会导致性能不佳,因为在每次递归调用的错误级别中寄存器都会大量推送弹出

在这种情况下,迭代方法是安全的。

查看this比较。

希望它有所帮助!

答案 1 :(得分:1)

在C ++中,递归实现通常比迭代实现更昂贵。 原因是每次调用都会导致创建一个新的堆栈帧,该堆栈帧包含需要保存的返回地址,局部变量和寄存器等数据。因此,递归实现需要大量的内存,这与嵌套调用的深度是线性的,而迭代实现使用恒定的内存量。 在您的特定情况下,即尾递归,编译器优化可以通过直接跳转来切换函数调用,从而防止在调用堆栈上不必要地使用内存。 有关更详细的说明,您可能需要阅读: Is recursion ever faster than looping?