Вызовы функций, которые ничего не делают в C ++ - PullRequest
0 голосов
/ 02 октября 2018

Почему, когда я вызываю функцию factorial, она ничего не делает?

Это правильный способ реализации факториальной функции?

#include <iostream>
#include <cmath>

using namespace std;

int factorial(int n)
{
    if (n <= 1)
    {
        return 1;
    }
    else 
    {
       return n * factorial(n-1);
    }
 }

 int main()
 {
     int x = 3;
     cout << x << endl;
     factorial(x);
     cout << x;
     return 0;
 }

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете изменить функцию factorial на передачу по ссылке и , используя возвращаемое значение для рекурсивного вычисления, обойдя вашу ошибку умножения ссылки следующим образом:

 int factorial(int &n){
   if (n <= 1){
      return n = 1;
   }
   else {
     int c = n - 1;
     return n = n * factorial(c);
   }

 }

Iхотя этот метод не очень нравится, так как было бы намного проще просто напечатать возвращаемое значение функции вместо длин, чтобы она передавала ссылку.

0 голосов
/ 02 октября 2018

Результат factorial отбрасывается, т. Е. Не привязывается к переменной для дальнейшей обработки.Исправить это просто:

const int result = factorial(x);

cout << "The result is " << result << "\n";

Это хорошая демонстрация, когда атрибут C ++ 17 nodiscard может быть полезен.Если подпись функции читает

[[nodiscard]] int factorial(int n)

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

factorial(42); // warning: ignoring return value of 'int factorial(int)', declared with attribute nodiscard [-Wunused-result]
...