1, 下面程序的结果是120,但是如果把第9行的abs(1)改成1的话,则程序的结果是1。试分析为什么会出现不同的结果。
int fact( )
{
static int i =5;
if(i == 0 )
{
return (i );
}
else
{
i= i-1;
return((i + abs(1))*fact()); // 第9行
}
}
int main()
{
printf("fact of 5 =%d/n", fact());
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解答:
(1)static 是静态变量,所有对i的操作都是对内存中的同一地址空间进行操作。所以每次进入递归操作的时候,上层对i的操作仍然有效。
(2)句子((i + abs(1))*fact()在递归操作中,(i + abs(1))的值先于fact()算出,因此整句的意思是计算5×4×3×2×1 = 120
(3)但是由于编译器的原因。在((i + abs(1))*fact()的时,由于*两边都有函数调用,在编译时首先产生左边式子的代码,随后产生右边的代码。改成i+1
以后,不会首先计算右边函数的值。每次递归调用的结果都是(i+1)fact。在第五次递归接受后,fact的值为1,但是i的值为0。所以结果为1。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------