题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。

法一:如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。我们可以将需要执行的代码放到构造函数里

  1. class Temp   
  2. public:  
  3. Temp() { ++ N; Sum += N; }  
  4. static void Reset() { N = 0; Sum = 0; }   
  5. static int GetSum() { return Sum; }   
  6. private:   
  7.     static int N;   
  8.     static int Sum;   
  9. };   
  10. int Temp::N = 0;  
  11. int Temp::Sum = 0;  
  12. int solution1_Sum(int n)   
  13. {   
  14.     Temp::Reset();   
  15.     Temp *a = new Temp[n];   
  16.     delete []a;  
  17.     a = 0;  
  18.     return Temp::GetSum();   

法二:我们同样也可以围绕递归做文章。既然不能判断是不是应该终止递归,我们不妨定义两个函数。一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。那现在的问题是如和把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。

  1. class A;  
  2. A* Array[2];  
  3. class A  
  4. public:  
  5. virtual int Sum (int n) { return 0; }   
  6. };  
  7. class B: public A   
  8. public:   
  9. virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }   
  10. };  
  11. int solution2_Sum(int n)   
  12. { A a;   
  13. B b;  
  14. Array[0] = &a;   
  15. Array[1] = &b;  
  16. int value = Array[1]->Sum(n);   
  17. return value;   

法三:以直接用函数指针数组

 

  1. typedef int (*fun)(int);   
  2.  int solution3_f1(int i) { return 0; }   
  3.  int solution3_f2(int i)   
  4.  { fun f[2]={solution3_f1, solution3_f2};  
  5.  return i+f[!!i](i-1);   
  6.  }