8

関数オブジェクトをそれ自体から呼び出すにはどうすればよいですか? 使えないようthisです。例:

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

何に配置し??ますか?

4

6 に答える 6

14
#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;
}

私にとってはうまくいきます。実例。

于 2013-07-29T15:45:31.647 に答える
4

前述DyPのように、電話をかけることができます(*this)(n-1)。ただ、読み方がおかしいので、別のメソッドに分割してcalculate_factoral呼び出したほうがいいでしょう。

于 2013-07-29T15:46:22.227 に答える
2

何人かが指摘しているように、(*this)(n - 1)構文をそのまま使用できます。しかし、この構文は正確には直観的ではないため、実際の実装を別の名前付きメソッドに分解することが、わずかに優れた解決策になる可能性があります。

class factorial { 
public:
  int operator()(int n) {
    return impl(n);
  }
private:
  int impl(int n) { 
    // actual work here 
  }
};
于 2013-07-29T15:48:43.977 に答える
1

You can either use explicit operator syntax:

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

Or dereference this:

class factorial {
  int operator()(int n) {
    if (n == 0)
      return 1;
    return n * (*this)(n-1);
  }
};
于 2013-07-29T15:53:52.237 に答える
0

確かに階乗?

私はJavaだけを知っており、再帰階乗は次のように書くことができます:

public class Factorial{

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

同じ原理が当てはまると思います。

于 2013-07-29T15:48:10.013 に答える