1

我正在编写一个程序来显示计算给定数字的阶乘 200 万次所需的时间。我在 C/C++ Eclipse 环境中使用 Debian Linux 编写它。当程序到达时int temp = n * rfact(n-1);,它会挂起并且不会做任何其他事情。

这是我到目前为止所得到的:

#include <stdio.h>
#include <time.h>

//prototypes
int rfact(int n);

main()
{
    int n = 0;
    int i = 0;
    double result = 0.0;
    clock_t t;
    printf("Enter a value for n: ");
    scanf("%i", &n);

printf("n=%i\n", n);

    //get current time
    t = clock();

    //process factorial 2 million times
    for(i=0; i<2000000; i++)
    {
        rfact(n);
    }

    printf("n=%i\n", n);

    //get total time spent in the loop
    result = (clock() - t)/(double)CLOCKS_PER_SEC;

    //print result
    printf("runtime=%d\n", result);
}

//factorial calculation
int rfact(int n)
{
    int temp = n * rfact(n-1);
    printf(i++);
    return temp;
}
4

3 回答 3

5

您缺少基本情况,因此您遇到了无限递归。当您到达n == 1或时,您需要停下来n == 0

int rfact(int n)
{
    if (n <= 0)
        return 1;
    return n * rfact(n-1);
}

此外,阶乘函数并不是递归的最佳用例,因为迭代版本可以说更具可读性并且可能更快,但这是另一回事:)

于 2013-02-25T00:34:39.147 回答
1

您的 rfact 函数中没有基本案例。这意味着 rfact(n-1) 将永远被调用。

于 2013-02-25T00:34:46.720 回答
1

我同意我上面的人,你错过了递归的基本情况

但是请注意执行 2'000'000 次阶乘,除了需要花费大量时间来终止计算之外,您的变量将溢出

于 2013-02-25T01:13:55.553 回答