因子递归C:类型问题

时间:2013-01-16 22:37:14

标签: c

在gcc 4.7.2(Ubuntu Server 12.10)上编译此代码时遇到问题

#include <stdio.h>

int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

我知道这可以用一个参数函数来完成,但这不是重点。

我得到的错误是:'fact'的冲突类型(函数声明行) 以前隐含的事实声明(与printf一致)

2 个答案:

答案 0 :(得分:6)

在您从fact

调用之前,您需要main的转发声明
long int fact(long int n, long int a); // forward declaration
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a) // actual function

在这种情况下,您可以将fact的实施移到main之上。但是请注意,这种方法不能扩展到更复杂的程序,而更长的函数会相互调用。

添加 你的阶乘功能是错误的。这是更正后的版本

long int fact(long int n)
{
   if (a == 1)
      return (n);
   return n * fact(n - 1);
}

答案 1 :(得分:0)

#include <stdio.h>
long int fact(long int n, long int a);
int main()
{
  long int facto = 30;
  printf("%ld\n", fact(facto, facto - 1);
}
long int fact(long int n, long int a)
{
   if (a == 1)
      return (n);
   fact(n * a, a - 1);
}

你需要一个函数原型,它基本上是带分号的函数的第一行。这将告诉编译器该函数是否存在。