рекурсивный и итеративный факториал в C ++ - PullRequest
2 голосов
/ 03 мая 2020

Я сделал дерьмовую программу на С ++ для вычисления факториала введенного значения, в которой я написал две функции для независимого выполнения фактических вычислений (одна итеративная, другая рекурсивная). Что не имеет для меня никакого смысла, так это почему итеративный факторный коллапс при n = 13, но рекурсивный проходит до верхней границы беззнакового long long int?

PS Я бы был благодарен за любые советы относительно качества моего кода, и с радостью исправлю его, спасибо.

#include <iostream>
using namespace std;

unsigned long long int rekursiv_fak (int); // function prototyping
unsigned long long int iterativ_fak (int);

int main () {
  unsigned int n; // factorial is defined only for positive integers !!
  cout << "Enter a positive integer value: ";
  cin >> n;
  cout << "The factorial of " << n << " is equal to: " << iterativ_fak(n) << " or alternatively " << rekursiv_fak(n) << endl;
  return 0;
}

unsigned long long int rekursiv_fak (int n) {
  if (n == 1)
    return 1;
  return n * rekursiv_fak(n - 1);
}
unsigned long long int iterativ_fak (int n) {
  for (int i{n - 1}; i > 0; --i) 
    n *= i;
  return n;
}

1 Ответ

5 голосов
/ 03 мая 2020

В iterativ_fak() вы умножаете переменную n, которая имеет тип int. Это 32-битный тип и может хранить только 12! при макс. rekursiv_fak(), с другой стороны, возвращает переменную типа long без знака и, следовательно, имеет 64 бита для хранения результата n * rekursiv_fak(n - 1).

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