Рекурсия и вызов функции

0

вот два разных кода:

основная функция:

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
    Это действительно не очень понятно. В обоих случаях функция вызывается, когда выполнение достигает соответствующей строки.
  • 1
    Где находится тело ()?
Показать ещё 4 комментария
Теги:
recursion

3 ответа

1
Лучший ответ

Разница между этими двумя фрагментами кода заключается в том, что в первой функции кодов функция получает элемент управления, а его stetemnets выполняются последовательно, за исключением операторов бранча. Поэтому, когда оператор

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;
}
  • 0
    Также функция fact () может быть вызвана, если вы определите глобальную переменную, которая находится вне какой-либо функции, и эта глобальная переменная будет содержать инициализатор, который вызывает функцию fact (). Например, int j = fact( 10 ); : элемент initializer не является константой времени компиляции
  • 0
    @ BLUEPIXY И что ?! Это C ++.
Показать ещё 6 комментариев
0

Функция gets() является библиотечной функцией в C++, которая считывает символы из стандартного ввода и сохраняет их как строку C в строку до тех пор, пока не будет достигнут символ новой строки или конец файла.

пожалуйста, можете ли вы четко указать свое предполагаемое значение "время инициализации", вы имеете в виду время инициализации программы или функцию main()?

  • 1
    Это должен быть комментарий, а не ответ.
  • 1
    Извините, но я только что присоединился и еще не заработал репутацию комментировать.
0

gets() не будет вызываться во время любой "инициализации", он будет вызываться, когда выполнение достигнет его. В вашем коде это означает, что он будет вызываться немедленно, поскольку это первое действие в main.

В вашей функции fact вы получите только рекурсивный вызов, если условие if(n==0) ложно.

Кстати, предполагая, что на fact вы имеете в виду факториала, то ваша функция неверна. Это должно быть примерно так:

int fact(int n)
{
  if(n == 0)
  {
    return 1;
  }
  else
  {
    return n * fact(n - 1);
  }
}
  • 1
    лол, это не факториал :)
  • 0
    Вычисление факториала с помощью рекурсии является плохим примером для вычисления факториала, но хорошим (популярным) для рекурсии объяснения. И первое условие может быть n <2.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню