Рекурсивный факторный возврат - PullRequest
0 голосов
/ 21 мая 2019

Почему мы используем return 1 для завершения рекурсивной функции? Можно ли использовать любое другое значение в качестве значения по умолчанию, например 1.

И если мы возвращаем 1 как возвращаемое значение функции, то почему 1 не возвращается основной функции.

 #include<stdio.h>
 int fact(int n)
 {
   if(n>=1)
      return (n*fact(n-1));
   else
      return 1;
 }
 int main()
 {
   int a,ans;
   scanf("%d",&a);
   ans=fact(a);
   printf("factorial of %d is %d ",a,ans);
   return 0;
  }
  /*
   explanation
          fact(4);
          if(4>=1) 4*fact(3)
          if(3>=1) 4*3*fact(2)
          if(2>=1) 4*3*2*fact(1)
          if(1>=1) 4*3*2*1*fact(0)
          if(0>=1) return 1;

  */

Ответы [ 4 ]

2 голосов
/ 21 мая 2019
int fact(int n)
{
    if (n >= 1)
        return n * fact(n-1);
    else
        return 1;
}

Каждый раз, когда вызывается функция fact(), она запускает либо оператор return n * fact(n-1);, либо оператор return 1;, но не оба.

Вы звоните fact(4) в main(). Вот как это работает:

main:
  compute fact(4)
  fact(4):
  |  4 >= 1?  Yes!
  |  compute 4 * fact(3)
  |    fact(3):
  |    |  3 >= 1?  Yes!
  |    |  compute 3 * fact(2)
  |    |    fact(2):
  |    |    |  2 >= 1? Yes!
  |    |    |  compute 2 * fact(1)
  |    |    |    fact(1):
  |    |    |    |  1 >= 1? Yes!
  |    |    |    |  compute 1 * fact(0)
  |    |    |    |    fact(0):
  |    |    |    |    |  0 >= 1? NO!
  |    |    |    |    |  return 1;
  |    |    |    |    +--> 1
  |    |    |    |  fact(0) is 1, return 1 * 1 (--> 1)
  |    |    |    +--> 1
  |    |    |  fact(1) is 1, return 2 * 1 (--> 2)
  |    |    +--> 2
  |    |  fact(2) is 2, return 3 * 2 (--> 6)
  |    +--> 6
  |  fact(5) is 6, return 4 * 6 (--> 24)
  +--> 24
  fact(4) is 24, assign it to `ans`, print it etc
// end of main

Когда функция использует оператор return (или после выполнения своего последнего оператора, если return не достигнут, управление передается обратно в выражение, которое его вызвало.

2 голосов
/ 21 мая 2019

почему мы используем «return 1» для завершения рекурсивной функции

Потому что это должно охватывать случай, когда n не >=1, другими словами, когда n равно 0. Я не думаю, что отрицательные n действительны. 0! равно 1, поэтому и возвращает это значение.

И если мы возвращаем 1 как конец функции, то почему 1 не возвращается основная функция.

Если функция вызывается с 0 или 1 для n, то 1 возвращается основной функции. Для любого другого значения 1 возвращается только в рекурсивных факториальных вызовах, а значение, возвращаемое функции main, не 1, а (n*fact(n-1)), что в этих случаях не 1 .

1 голос
/ 21 мая 2019

Оператор возврата выполняется, когда n==0.

Факториал для n==0 равен 1, поэтому мы возвращаем 1.

0 голосов
/ 21 мая 2019
   /*
      explanation
          fact(4);
          if(4>=1) 4*fact(3)
          if(3>=1) 4*3*fact(2)
          if(2>=1) 4*3*2*fact(1)
          if(1>=1) 4*3*2*1*fact(0)
          if(0>=1) return 1; now return is default tend to multiply as we give 1 and 
           return has already 24 in its stack so 1*24 is returned to main()
          if we give return 2; 2*24 is returned to main();

    */

мы не хотим, чтобы наш конечный результат был затронут, чтобы решить эту ошибку, все, кратное 1, приведет к тому же результату, поэтому мы используем 1 в качестве возврата в рекурсивной функции.

На самом деле return также является регистром стека, который содержит временную переменную при вызове функции, и он работает по умолчанию с помощью свойства multiply, поскольку мы всегда можем отправить только одно возвращаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...