递归阶乘实现的分割错误



现在我正在Linux上练习使用Vim。 我做了这样的简单代码

#include <stdio.h>
int factorial(int n){
if (n<0) { return 0; }
else if (n==0) { return 1; }
else { return n * factorial(n); }
}
int main(void){
int n = 0;
printf("Put n value : ");
scanf("%d", &n);  /* non-OP inserted ";" to help people focus on the problem */
printf("%d! = %dn", n, factorial(n));
return 0;
}

当我输入 -1 和 0 时,它可以工作。它们返回 0 和 1。 但是,当我在 n 上放置正整数值时,它不起作用。 我试图找出原因,所以我使用了gdb,
但它只是这样说:

程序接收信号SIGSEGV,分段错误。
阶乘 (( 中的0x0000000000400620

我的代码有什么问题?我什至无法理解这一点。

n > 0时,递归程序永远不会终止。n的值永远不会递减,因此它将继续递归运行,直到内存不足。

应该是return n * factorial(n-1);

您的代码导致堆栈溢出。在给定的函数中,n永远不会递减。最后一句话应该是

else { return n * factorial(n-1); }

最新更新