我试图以稍微不同的方式实现递归,但我对所述数学的实现感到难过。
这是我的代码:
#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))
方式,我在代码中实现它失败了。数学不是我的绝对强项,但我没事。
答案 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)。