为什么使用if
语句计算阶乘的第一个递归函数在不保留内存的情况下工作?
int factorial(int number) {
int temp;
if(number <= 1) return 1;
temp = number * factorial(number - 1);
return temp;
}
但是,第二个语句将编译并抛出分段错误。
long long int fact( long long int in ) {
return in < 2 ? : in * fact(in--);
}
答案 0 :(得分:2)
long long int fact( long long int in ){
return in < 2 ? : in * fact(in--);
}
遇到以下问题。
问题1
你没有在&#34; true&#34;中获得价值。三元运算符的一部分。
return in < 2 ? : in * fact(in--);
^^ Missing value
问题2
取决于首先评估in
或fact(in--)
,该函数可能是:
long long int fact( long long int in ){
int temp1 = in;
in--
long long temp2 = in < 2 ? : (temp1-1) * fact(temp1);
return temp2;
}
或
long long int fact( long long int in ){
int temp1 = in;
in--;
long long temp2 = in < 2 ? : temp1 * fact(temp1);
return temp2;
}
问题3
无论如何评估术语in * fact(in--)
,传递给函数的下一次调用的值是in
,而不是in - 1
。因此,您会遇到无限递归,这会导致堆栈溢出。
<强>解决方案强>
long long int fact( long long int in ){
return in < 2 ? 1 : in * fact(in-1);
}