为什么要使用递归来求一个数的阶乘?

Pat*_*tya 2 c codeblocks

为什么我们不能直接使用它呢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);
}
Run Code Online (Sandbox Code Playgroud)

Min*_*eat 5

您不必使用递归。因为 C 不支持所谓的尾部递归调用优化,所以您应该避免使用可以用简单循环代替的递归。但 C 确实支持递归如果我们不注意它不是最优代码,那么这样的阶乘就是递归函数的最简单的例子。

实际需要的递归的最简单用例可能是目录树循环。如果您尝试在后一种情况下用循环替换递归,您将得到可读性大大降低的代码,并且您仍然需要一个具有 O(N) 内存的堆栈,其中 N 是最大目录嵌套级别,因此,在大多数常见情况下,您不会从这种优化尝试中获得任何有用的结果。

另外,请注意 vanilla C 缺乏对动态数据结构的内置支持。当然,您可以通过使用可通过malloc()realloc()free()C 运行时库的函数访问的堆内存来实现可变大小的堆栈,但这种方法会增加项目的复杂性。您必须注意指针以避免泄漏和内存损坏。