递归和函数调用

时间:2014-02-01 11:37:17

标签: c++ c recursion

这里有两个不同的代码:

主要功能:

int main()
{
  int i=3+gets();   //it calls gets() and store value in i//
  return 0;
}

递归函数:

int fact(n)
{
  if(n==0)
  return 1;
  int i=fact(n/2);   //Why fact() is not called here//
  return i;
}

我的问题是:

为什么在初始化时没有调用fact()但在main()中调用了gets()?

3 个答案:

答案 0 :(得分:1)

这两个代码片段之间的区别在于,在第一个代码函数main中获取控件,并且除了早午餐语句之外,其顺序执行顺序执行。所以当声明时

int i=3+gets();   

获取控制函数gets()被调用。

在第二个代码段声明中

int i=fact(n/2);   
在函数fact()获得控件之前,不会执行

。如果你要编写例如

,你可以达到同样的效果
int main()
{
  int i= fact( 10 );
  return 0;
}

在这种情况下,将调用函数事实并执行其正文。

如果你要定义一个在任何函数之外的全局变量,并且这个全局变量将包含一个调用函数fact()的初始化器,也可以调用函数fact()。例如

int j = fact( 10 );

int main()
{
  int i=3+gets();   //it calls gets() and store value in i//
  return 0;
}

答案 1 :(得分:0)

在任何“初始化”期间都不会调用

gets(),它会在执行到达时被调用。在您的代码中,这意味着它将立即被调用,因为它是main中的第一个操作。

fact函数中,如果if(n==0)条件为false,则只会进行递归调用。

顺便说一句,假设fact你的意思是阶乘,那么你的功能是不正确的。它应该是这样的:

int fact(int n)
{
  if(n == 0)
  {
    return 1;
  }
  else
  {
    return n * fact(n - 1);
  }
}

答案 2 :(得分:0)

gets()是C ++中的库函数,它从标准输入读取字符并将它们作为C字符串存储到字符串中,直到到达换行符或文件结尾。

请你明白你对“初始化时间”的意图,你的意思是初始化程序或main()函数的时间吗?