0

嗨,我已经在 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));
    }
}

最终输出(阶乘的值)按预期出现,但调试语句的输出让我感到惊讶。

calculating 4 * factorial 0
calculating 3 * factorial 0
calculating 2 * factorial 0
calculating 1 * factorial 0
120

每个调试语句中使用相同的值 *n 两次,它显示不同的值。在一个语句中使用两次相同的值怎么可能给出不同的结果。

4

3 回答 3

3

我只是在这里猜测,但格式代码"%d"是 for int,而您传递long long. 这是每个值 32 位的差异。改用"%llu""ll"for long long"u"for unsigned)。

于 2013-10-15T08:18:33.817 回答
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;
}
于 2013-10-15T08:20:08.057 回答
0

您正在修改n每次递归迭代的值。

当您使用带有指针的递归时:

return ((*n+1) * factorial(n));

您首先计算 的值factorial(n)。当达到最后一次递归迭代时,您已经减少了ntill 0

所以,请不要n 通过引用传递。

于 2013-10-15T08:20:05.790 回答