逻辑在哪里错了?

时间:2011-04-24 19:08:46

标签: c algorithm

我写了一个memoized代码,用于计算C中数字的阶乘。但是在输入为n=3时,它会将输出显示为6! = 134513904。有人可以解释出现了什么问题吗?

int fact(int n)
{
int temp;
static int lookup_table[100];
if(lookup_table[n])
    return lookup_table[n]; 
else if(n == 0 )
{
    lookup_table[0]= 1;
    return 1;
}   
else
{
    temp = n * fact(n-1);
    lookup_table[n] = temp;
    return temp;
}

}

3 个答案:

答案 0 :(得分:5)

一个问题可能是你没有初始化你的表,所以它充满了内存中发生的任何事情。

编辑:啊,看来我错了,行为定义得很好:

  

如果未初始化具有静态存储持续时间的对象   显式地,它被隐式初始化,好像每个成员都有   算术类型被赋值为0,每个成员都有指针类型   被分配了一个空指针常量。

Source

答案 1 :(得分:4)

您的printf(来自评论)没有正确数量的参数,因此会打印垃圾值:

printf("\n%d! = %d\n",result);

与其他人所说的相反,数组不必明确初始化,正如C标准所说:

  

如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:

     
      
  • 如果它有指针类型,则将其初始化为空指针
  •   
  • 如果它具有算术类型,则将其初始化为(正向或未对齐)
  •   
  • 如果它是聚合,则根据这些规则初始化(递归)每个成员
  •   
  • 如果是联盟,则根据这些规则初始化(递归)第一个命名成员。
  •   

然而,明确初始化是为了让你的意图明确,这是很好的实践。

答案 2 :(得分:0)

就像我怀疑的那样,问题在于printf而不是功能。