我写了一个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;
}
}
答案 0 :(得分:5)
一个问题可能是你没有初始化你的表,所以它充满了内存中发生的任何事情。
编辑:啊,看来我错了,行为定义得很好:
如果未初始化具有静态存储持续时间的对象 显式地,它被隐式初始化,好像每个成员都有 算术类型被赋值为0,每个成员都有指针类型 被分配了一个空指针常量。
答案 1 :(得分:4)
您的printf(来自评论)没有正确数量的参数,因此会打印垃圾值:
printf("\n%d! = %d\n",result);
与其他人所说的相反,数组不必明确初始化,正如C标准所说:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针
- 如果它具有算术类型,则将其初始化为(正向或未对齐)
- 如果它是聚合,则根据这些规则初始化(递归)每个成员
- 如果是联盟,则根据这些规则初始化(递归)第一个命名成员。
然而,明确初始化是为了让你的意图明确,这是很好的实践。
答案 2 :(得分:0)
就像我怀疑的那样,问题在于printf
而不是功能。