为什么递归用于查找数字的阶乘?
why is the recursion used in finding the factorial of a number?
为什么我们不能直接在main
中使用它?
为什么要有递归?
#include<stdio.h>
int factorial(int n);
int main()
{
int n;
printf("Enter an positive integer: ");
scanf("%d",&n);
printf("Factorial of %d = %ld", n, factorial(n));
return 0;
}
int factorial(int n)
{
if(n!=1)
return n*factorial(n-1);
}
您不必使用递归。因为 C 不支持所谓的尾递归调用优化,所以您应该避免递归,因为递归可以用简单的循环代替。但是C确实支持递归,这样的阶乘是递归函数最简单的例子,如果我们不注意它不是最优代码。
实际需要的最简单的递归用例可能是目录树循环。如果您尝试在后一种情况下用循环替换递归,您将获得可读性较低的代码,并且您仍然需要一个具有 O(N) 内存的堆栈,其中 N 是最大目录嵌套级别,因此,在大多数常见情况下,你不会从这种优化尝试中获得任何有用的东西。
此外,请注意 vanilla C 缺乏对动态数据结构的内置支持。当然,您可以通过使用可通过 malloc()
、realloc()
和 free()
C 运行时库函数访问的堆内存来实现可变大小的堆栈,但这种方法会增加 复杂性 您的项目。您将不得不照顾您的指针以避免泄漏和内存损坏。
为什么我们不能直接在main
中使用它?
为什么要有递归?
#include<stdio.h>
int factorial(int n);
int main()
{
int n;
printf("Enter an positive integer: ");
scanf("%d",&n);
printf("Factorial of %d = %ld", n, factorial(n));
return 0;
}
int factorial(int n)
{
if(n!=1)
return n*factorial(n-1);
}
您不必使用递归。因为 C 不支持所谓的尾递归调用优化,所以您应该避免递归,因为递归可以用简单的循环代替。但是C确实支持递归,这样的阶乘是递归函数最简单的例子,如果我们不注意它不是最优代码。
实际需要的最简单的递归用例可能是目录树循环。如果您尝试在后一种情况下用循环替换递归,您将获得可读性较低的代码,并且您仍然需要一个具有 O(N) 内存的堆栈,其中 N 是最大目录嵌套级别,因此,在大多数常见情况下,你不会从这种优化尝试中获得任何有用的东西。
此外,请注意 vanilla C 缺乏对动态数据结构的内置支持。当然,您可以通过使用可通过 malloc()
、realloc()
和 free()
C 运行时库函数访问的堆内存来实现可变大小的堆栈,但这种方法会增加 复杂性 您的项目。您将不得不照顾您的指针以避免泄漏和内存损坏。