C中的递归与Pre增量

时间:2009-07-09 16:05:41

标签: c recursion

int fact_rec(int n)
{
    printf("%d\n",n);
    if(n==1) return n;
    else return fact_rec(--n)*n;
    //else return n*fact_rec(--n); gives same result
    //correct output comes for n*fact(n-1)
}

在上面的阶乘函数的递归实现中, fact_rec(5)返回24.然而,如果我使用 n*fact_rec(n-1) 代替 n*fact_rec(--n) 输出是正确的:120。 此外,我是否使用并不重要 n*fact_rec(--n) 要么 fact_rec(--n)*n。 如果我使用,应该不重要 n*fact_rec(--n) 要么 fact_rec(--n)*n

输出不应该 在所有情况下都是120?

5 个答案:

答案 0 :(得分:19)

return fact_rec(--n)*n

很危险。参数评估的顺序在C中是未定义的(&&||,逗号和三元运算符除外)因此第二次出现n的值可能会有所不同。

经验法则:永远不会使用变量,而是在一个表达式中递增/递减两次。

答案 1 :(得分:4)

您的混淆似乎与订单有关 - 与其他答案不同,我假设您已经知道--n做了什么......

编译器知道它需要fact_rec(--n)的值才能评估fact_rec(--n)*n,无论你编写它的方式如何,所以首先计算函数,并且n的值加倍总是已经减少。

答案 2 :(得分:0)

实际上根本不需要修改n。 return n * fact_rec(n - 1)会照顾它,并且是正确的方法。

答案 3 :(得分:-1)

你函数中的

--n实际上意味着:

int fact_rec(int n) {
    printf("%d\n",n);

    if(n==1) {
         return n; 
    } else {
        n = n - 1; /* <---- effect of --n */
        return fact_rec(n)*n;
    }
}

答案 4 :(得分:-1)

问题在于:

否则返回fact_rec( - n)* n;

你在乘法之前递减n

所以如果n从5开始,则以

运行

return fact_rec(4)* 4;

编辑:唐投票赞成问题的正确答案?我不明白。