教师和递归因素

时间:2015-09-30 08:07:20

标签: c++ templates math recursion

我试图以稍微不同的方式实现递归,但我对所述数学的实现感到难过。

这是我的代码:

#include <iostream>
using namespace std;



template <const int n>
class faculty
{
public:
    static const int val = faculty<n - 1>::val * n; //Recursion!!!!
};


//For when 1!, return value of 1!
template <>
class faculty<1>
{
public:
    static const int val = 1;
};


//Falling Factorial
template <const int n, const int k>
class fallingcfactorial
{
public:
    static const int n_k = faculty<n>::val / faculty<n - k>::val;
    // (n * n - 1 * ... * 1) / ((n - k) * (n - k + 1) * ... * 1)
};



// Implementing the Factorial a different way
// (n * (n - 1) * ... * (n - k + 1))


//For when n = k then output = 1
template <const int n>
class fallingcfactorial<n, n>
{
public:
    static const int n_k = 1;

};


int main(void) {
    cout << "Faculty of 5 (1*2*3*4*5): " << faculty<5>::val << endl;
    cout << "n(10)_k(5) = " << fallingcfactorial<10, 5>::n_k << endl;
}

尝试(n * (n - 1) * ... * (n - k + 1))方式,我在代码中实现它失败了。数学不是我的绝对强项,但我没事。

1 个答案:

答案 0 :(得分:1)

使用模板有点棘手。我认为这应该可以解决你的问题:

#include <iostream>
using namespace std;

template <const int n, const int k>
class fallingFactorial
{
public:
    static const int n_k = fallingFactorial<n - 1, k>::n_k * n;
};

template <const int n>
class fallingFactorial<n, n>
{
public:
    static const int n_k = 1;
};

int main(void) {
    cout << fallingFactorial<10, 5>::n_k << endl;
    return 0;
}

此示例基于部分模板特化(template <const int n> class fallingFactorial<n, n>)。调用模板类时,使用最佳匹配和“最专业”模板。一些较旧的编译器不支持部分特化(参见wiki)。