求1+2+3+……+n

来自剑指offer

分析:发散思维题

方法一:利用构造函数求解

 常规做法,和单例模式有点像。可以回想一下单例模式是如何利用构造函数的(将构造函数私有,用定义一个静态成员函数调用构造函数)。

//利用构造函数实现
class Temp
{
public:
	Temp()
	{
		N++;
		Sum += N;
	}
	static void Reset() {N=0; Sum=0;}
	static unsigned int GetSum() {return Sum;}
private:
	static unsigned int N;
	static unsigned int Sum;
};
unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;

unsigned int Sum_Solution1(unsigned int n)
{
	Temp::Reset();
	Temp* p = new Temp[n];
	delete[] p;
	p = NULL;

	return Temp::GetSum();
}

 

方法二:利用虚函数求解

递归有两个条件,一个是递归语句,一个是处理递归出口。我们用两个虚函数来表示。

//利用虚函数实现
class A;
A* Array[2];

class A
{
public:
	virtual unsigned int Sum(int n)	//由于n值可能为-1不能为unsigned
	{
		return 0;
	}
};

class B:public A
{
public:
	virtual unsigned int Sum(int n)
	{
		return Array[!!n]->Sum(n-1) +n;
	}
};

unsigned int Sum_Solution2(unsigned int n)
{
	A a;
	B b;
	Array[0] = &a;
	Array[1] = &b;

	unsigned int value = Array[1]->Sum(n);

	return value;
}

通过调用n次Array[1]来完成操作,和终止调用一次Array[0]来完成

方法三:利用函数指针求解

//利用函数指针求解
typedef unsigned int (*fun)(unsigned int);

unsigned int Sum_Solution3_Teminator(unsigned int n)
{
	return 0;
}

unsigned int Sum_Solution3(unsigned int n)
{
	static fun f[2] ={Sum_Solution3_Teminator, Sum_Solution3};
	return n+f[!!n](n-1);
}

 其实和方法二类似,不过用的是函数指针。

方法四:利用模板类型求解

让编译器完成递归计算,

//利用模板类求解
template<unsigned int n> 
class Sum_Solution4
{
public:
	enum Value{N=Sum_Solution4<n-1>::N +n};
};

template<>
class Sum_Solution4<1>
{
public:
	enum Value{N=1};
};

Sum_Solution4<10>::N就是1+2+3+……+10的结果。当编译器看到Sum_Solution4<10>时,就会为模板类Sum_Solution4以参数10生成该类型的代码。但以10为参数的类型需要得到9为参数的类型,因为Sum_Solution4<10>::N=Sum_Solution4<9>::N +10. 这个过程会一直递归到参数为1的类型,由于该类型已经显示定义,编译器无需生成,递归编译到此结束。

缺点一:该过程是编译过程中完成的,因此需要输入n必须是编译期间能确定的常量,不能动态输入

缺点二:编译器对递归深度是有限制的,也就是要求n不能太大。

你可能感兴趣的:(求1+2+3+……+n)