您好我已经在Visual C ++中实现了一个C代码,并在其中进行了一些修改以进行调试。这是代码
long long unsigned factorial(long long unsigned int * n) {
if (*n<=1) return 1;
else {
(*n)--;//This statement here .......
printf("calculating %d * factorial %d \n",*n,*n); -- used for debugging
return ((*n+1) * factorial(n));
}
}
最终输出(factorial的值)正如预期的那样出现,但它是令我感到惊讶的调试语句的输出。
calculating 4 * factorial 0
calculating 3 * factorial 0
calculating 2 * factorial 0
calculating 1 * factorial 0
120
相同的值* n在每个调试语句中使用两次,它显示不同的值。如果在语句中使用两次相同的值,可能会产生不同的结果。
答案 0 :(得分:3)
我只是在这里猜测,但格式代码"%d"
适用于int
,而您传递long long
。这是每个值32位的差异。请改为使用"%llu"
("ll"
代表long long
,"u"
代表unsigned
。
答案 1 :(得分:1)
因为unsigned long long
使用了错误的格式,请测试一下:
#include <stdio.h>
long long unsigned factorial(long long unsigned int * n) {
if (*n<=1) return 1;
else {
(*n)--;//This statement here .......
printf("calculating %llu * factorial %llu \n",*n,*n);
return ((*n+1) * factorial(n));
}
}
int main(void)
{
long long unsigned int n = 4ULL;
n = factorial(&n);
printf("%llu\n", n);
return 0;
}
答案 2 :(得分:0)
您正在每次递归迭代时修改n
的值。
使用指针进行递归时:
return ((*n+1) * factorial(n));
您首先计算factorial(n)
的值。当达到最后一次递归迭代时,您已经将n
递减到0
。
所以,请不要通过引用传递n
。