题目概述
解题思路
这道题目不能用循环,同时呢,禁用了if等判断语句表示也不可以用递归求解
这道题目考的是对C++语法内容的熟练程度
这道题目可以从构造函数,虚函数,函数指针以及模板求解
方法1:利用构造函数求解
我们可以定义一个类,类有两个静态的成员,一个N,一个Sum
并初始化为0
每当调用构造函数时,N++,然后用Sum加上当前的N值
如此,当我们需要加到X时,便可以生成X个对象
然后获取类内部的Sum值即可
构造函数方法的代码实现
//方法1:利用构造函数
class A
{
public:
A()
{
++N;
Sum += N;
}
static int GetNum()
{
return Sum;
}
public:
static int N;
static int Sum;
};
int A::N = 0;
int A::Sum = 0;
void TestGetValueByConStruct()
{
A* pa = new A[5];
cout << A::GetNum() << endl;
}
方法2:利用虚函数进行求解
利用虚函数的主要思路是,让A类的fun成员函数扮演着递归条件终止的角色
让A类的派生类B类中的虚函数fun扮演递归的角色
定义A类的数组Array[2],分别指向一个A类,B类对象
通过判断是否加到N来决定调用哪个类的fun函数
//方法2
//利用虚函数求解
class AA;
AA* Array[2];
class AA
{
public:
virtual size_t Sum(size_t n)
{
return 0;
}
};
class BB :public AA
{
public:
virtual size_t Sum(size_t n)
{
return Array[!n]->Sum(n-1) + n;
}
};
int GetValueByVirtual(size_t n)
{
AA a;
BB b;
Array[0] = &b;
Array[1] = &a;
int value = Array[0]->Sum(n);
return value;
}
void TestGetValueByVirtual()
{
cout << GetValueByVirtual(5) << endl;
}
方法3:利用函数指针进行求解
大体的思路和虚函数是类似的,定义一个函数指针pfun
定义两个函数,一个控制递归的结束
一个控制递归的相加
定义函数指针数组,分别指向两个函数即可
//方法3
//函数指针求解
typedef size_t (*pfun)(size_t n);
size_t FunPointer1(size_t n)
{
return 0;
}
size_t FunPointer2(size_t n)
{
pfun pF[2] = { FunPointer2, FunPointer1};
return pF[!n](n-1) + n;
}
size_t GetValueByFunPointer(size_t n)
{
return FunPointer2(n);
}
void TestGetValueByFunPointer()
{
cout<< GetValueByFunPointer(5) << endl;
}
方法4:用模板进行求解
这里呢,我们可以用到特化来判断递归的终止条件
思路也很简单
//方法4:用模板类型求解
template<size_t N>
size_t F()
{
return N + F<N - 1>();
};
template<>
size_t F<1>()
{
return 1;
};
void TestGetValueByTemplate()
{
cout << F<5>() << endl;
}