【发布时间】:2020-05-19 07:57:33
【问题描述】:
我编写了使用递归进行阶乘计算的程序,正如课堂上所教的那样。我观察到这一点:大于 65 的数字的阶乘始终给出输出为 0。
//program to recursively calculate the value of factorial for a given integer!
#include <stdio.h>
#include <stdint.h>
unsigned long rfacta(uint32_t n){
if(n>0)
return rfacta(n-1)*n;
else
return 1;
}
unsigned long rfactd(uint32_t n){
if(n>0)
return n*rfactd(n-1);
else
return 1;
}
int main(void){
uint32_t number, methd;
unsigned long fctorial;
printf(" Enter 0 for call-time recursion\n Enter 1 for return-time recursion\n Enter 2 to print the table of passible factorials on this system\n\n");
scanf("%d",&methd);
switch(methd){
case 0:
printf("Compute factorial for number = ? \n");
scanf("%d",&number);
fctorial = rfacta(number);
printf("Factorial(%d) = %lu\n",number,fctorial);
break;
case 1:
printf("Compute factorial for number = ? \n");
scanf("%d",&number);
fctorial = rfactd(number);
printf("Factorial(%d) = %lu\n",number,fctorial);
break;
case 2:
for(int i=0;rfacta(i)!=0;i++){
printf("Factorial(%d) = %lu\n",i,rfacta(i));
}
break;
default:
printf("Incorrect entry! \n");
break;
}
return 0;
}
output Screenshot attachment: Recursion program for factorial returning 0
问题:
正如我们在输出中看到的[附上截图图像],有三个区域:
区域 1:在该区域中,阶乘的输出是正确的。原因是,
log2(20!) ~= 62, [这里 logm(n) 表示以 m 为基数的 n 的对数] 即假设一台 64 位机器,那么在单个地址可以正确表示的最大阶乘数是 20 !,然后发生内存溢出,因为 log2(21!) ~= 65。因此,这么大的数字不能用 64 位地址表示。
区域 2:在该区域中,阶乘的值非零但不正确。其原因,如上所述,是因为阶乘整数太大,无法用单个 64 位地址表示。因此,我们看到的函数输出实际上是随机的 64 位长无符号整数。
区域 3:对于阶乘 (n > 65),阶乘 (n)=0。
我无法理解为什么 n>65, n! = 0 由程序返回?
据我了解,区域 2 必须继续进行而不是停止。但是它一直在我在 n=65 处尝试过我的代码的所有机器上停止,这让我感到困惑。提前感谢您的帮助。
【问题讨论】: