例如,我有一个计算n!的递归函数。
int fact(int n){
if(n==1)
return 1;
return n*fact(n-1);
}
我的问题是为什么我不能将n-1替换为n-?
答案 0 :(得分:4)
有两个原因。
一个,n--
是递减的。用作折旧的值应为n
的原始值(非递减值)。
两个,n
在表达式中使用两次(一次作为*
的左侧参数,一次在递归调用的参数中)。在这种情况下,C和C ++都没有指定评估顺序,因此不清楚n
是在n--
(甚至是--n
之前还是之后)进行评估。
答案 1 :(得分:3)
因为它更改了n
的值。由于该值用于计算表达式n * fact(...)
,因此必须在对n
求值后 读取fact
的值。由于必须将--n
(或n--
,在这里无关紧要)作为值传递给fact
,因此减量必须发生在fact
之前被调用。因此,表达式结果将是错误的。