Я написал программу с использованием рекурсии для факторных вычислений, как преподавали в классе. Я наблюдал это: факториал с числом больше 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 Приложение скриншота: Программа рекурсии для факториала, возвращающего 0
Вопрос:
Как мы видим на выходе [прикрепленное изображение скриншота], есть три области:
Область 1: В этой области выходные данные для факториала верны. Причина этого заключается в том, что
log2 (20!) ~ = 62, [здесь logm (n) означает логарифм n для базы m], то есть предполагается, что 64-битная машина, то наибольшее факториальное число то, что может быть правильно представлено на одном адресе, составляет 20 !, и после чего происходит переполнение памяти, потому что log2 (21!) ~ = 65. Следовательно, такое большое число не может быть представлено 64-битным адресом.
Регион 2: В этом регионе значение факториала ненулевое, но неверное. Причина этого, как описано выше, заключается в том, что целое число факториала настолько велико, что его нельзя представить одним 64-битным адресом. Таким образом, то, что мы вместо этого видим в качестве выходных данных функции, на самом деле представляет собой случайные целые числа без знака длиной 64 бита.
Область 3: для факториала (n> 65), факториал (n) = 0.
Я не могу понять, почему именно для n> 65, n! = 0, как возвращается программой?
Из того, что я понимаю, область 2 должна go включаться, а не останавливаться. Но это постоянно останавливалось на всех машинах, которые я пробовал в своем коде при n = 65, меня озадачило. Заранее спасибо за помощь.