Рекурсивно вызывать объект функции

Как я могу вызвать функциональный объект изнутри себя? Кажется я не могу использовать this, Пример:

class factorial {
public:
int operator()(int n) {
if (n == 0)
return 1;
return n * ??(n-1);
}
};

Что я ставлю на ???

8

Решение

#include <iostream>

class factorial {
public:
int operator()(int n) {
if (n == 0)
return 1;
return n * (*this)(n-1);
}
};

int main()
{
std::cout << factorial()(5) << std::endl;
}

У меня отлично работает. Живой пример.

13

Другие решения

Вы можете использовать имя перегруженного оператора:

operator()(n-1);

или вызовите оператор для текущего объекта:

(*this)(n-1);
9

Как DyP упоминается, вы можете позвонить (*this)(n-1), Тем не менее, это странно читать, так что вам лучше разбить его на отдельные calculate_factoral метод и вызов этого вместо

4

Как указали несколько человек, вы можете просто использовать (*this)(n - 1) синтаксис. Но этот синтаксис не совсем интуитивно понятен, и несколько лучшим решением может быть фактическая реализация в другой именованный метод.

class factorial {
public:
int operator()(int n) {
return impl(n);
}
private:
int impl(int n) {
// actual work here
}
};
2

Вы можете использовать явный синтаксис оператора:

class factorial {
int operator()(int n) {
if (n == 0)
return 1;
return n * operator()(n-1);
}
};

Или разыменование this:

class factorial {
int operator()(int n) {
if (n == 0)
return 1;
return n * (*this)(n-1);
}
};
1

факториал наверняка?

Я знаю только Java и рекурсивный факториал можно записать так:

public class Factorial{

public int factorial(int n) {
return (n > 1) ? n * factorial(n-1) : 1;
}
}

Я предполагаю, что применяется тот же принцип.

0
По вопросам рекламы [email protected]