迭代或递归阶乘
Iterative or Recursive Factorial
我以这种方式递归地实现了阶乘:
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();
}
哪种实现此类代码的方法更有用,是使用迭代和循环编写还是像上面那样递归编写?
这取决于数字本身。
对于正常范围的数字,可以使用递归解决方案。由于它利用以前的值来计算未来的值,因此它可以即时提供 'factorial(n-1)' 的值。
factorial(n) = factorial(n-1) * n
但是,由于递归使用堆栈,如果您的计算深度超过堆栈大小,它最终会溢出。此外,递归解决方案的性能会很差,因为每次递归调用的病态级别中寄存器的大量推入。
在这种情况下,迭代方法是安全的。
看看this比较。
希望对您有所帮助!
在 C++ 中,递归实现通常比迭代实现更昂贵。
原因是每次调用都会创建一个新的堆栈帧,其中包含需要保存的数据,例如 return 地址、局部变量和寄存器。因此,递归实现需要的内存量与嵌套调用的深度成线性关系,而迭代实现使用的内存量是恒定的。
在您的特定情况下,即尾递归,编译器优化可能会通过直接跳转来切换函数调用,从而防止在调用堆栈上不必要地使用内存。
有关更详细的说明,您可能需要阅读:
Is recursion ever faster than looping?
我以这种方式递归地实现了阶乘:
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();
}
哪种实现此类代码的方法更有用,是使用迭代和循环编写还是像上面那样递归编写?
这取决于数字本身。
对于正常范围的数字,可以使用递归解决方案。由于它利用以前的值来计算未来的值,因此它可以即时提供 'factorial(n-1)' 的值。
factorial(n) = factorial(n-1) * n
但是,由于递归使用堆栈,如果您的计算深度超过堆栈大小,它最终会溢出。此外,递归解决方案的性能会很差,因为每次递归调用的病态级别中寄存器的大量推入。
在这种情况下,迭代方法是安全的。
看看this比较。
希望对您有所帮助!
在 C++ 中,递归实现通常比迭代实现更昂贵。 原因是每次调用都会创建一个新的堆栈帧,其中包含需要保存的数据,例如 return 地址、局部变量和寄存器。因此,递归实现需要的内存量与嵌套调用的深度成线性关系,而迭代实现使用的内存量是恒定的。 在您的特定情况下,即尾递归,编译器优化可能会通过直接跳转来切换函数调用,从而防止在调用堆栈上不必要地使用内存。 有关更详细的说明,您可能需要阅读: Is recursion ever faster than looping?