三元条件和if语句之间的内存使用情况如何不同?

时间:2015-11-23 02:07:41

标签: c++ recursion memory-management

为什么使用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--);
}

1 个答案:

答案 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

取决于首先评估infact(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);
}