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?
答案 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;
编辑:唐投票赞成问题的正确答案?我不明白。