求1....

来自剑指offer
分析:发散思维题
方法一:利用构造函数求解
&常规做法,和单例模式有点像。可以回想一下单例模式是如何利用构造函数的(将构造函数私有,用定义一个静态成员函数调用构造函数)。
//利用构造函数实现
class Temp
N++;
Sum += N;
static void Reset() {N=0; Sum=0;}
static unsigned int GetSum() {return S}
static unsigned int N;
static unsigned int S
unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;
unsigned int Sum_Solution1(unsigned int n)
Temp::Reset();
Temp* p = new Temp[n];
return Temp::GetSum();
方法二:利用虚函数求解
递归有两个条件,一个是递归语句,一个是处理递归出口。我们用两个虚函数来表示。
//利用虚函数实现
A* Array[2];
virtual unsigned int Sum(int n) //由于n值可能为-1不能为unsigned
class B:public A
virtual unsigned int Sum(int n)
return Array[!!n]-&Sum(n-1) +n;
unsigned int Sum_Solution2(unsigned int n)
Array[0] = &a;
Array[1] = &b;
unsigned int value = Array[1]-&Sum(n);
通过调用n次Array[1]来完成操作,和终止调用一次Array[0]来完成
方法三:利用函数指针求解
//利用函数指针求解
typedef unsigned int (*fun)(unsigned int);
unsigned int Sum_Solution3_Teminator(unsigned int n)
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
enum Value{N=Sum_Solution4&n-1&::N +n};
template&&
class Sum_Solution4&1&
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+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
分析:这道题没有多少实际意义,因为在软件开发中不会...
转载自:浅谈《剑指offer》原题:求1+2+……+n
如侵犯您的版权,请联系:
《剑指offer》上的一道原题,求1+2+……+n,要求不能使用乘除法,for、while、if、else、switch、case等关键字以及条件判断语句(a?b:c)。 第一次看到这道题大约有一年的...
原题目:输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解
c语言解法分析:
           先判定n和m的大小,如果m小于n,则只需从1...
题目:1*2*3*……*100
求结果末尾有多少个零
分析:一般类似的题目都会蕴含某种规律或简便方法的,阶乘末尾一个零表示一个进位,则相当于乘以10而10
是由2*5所得,在1~100当...
求n的n次幂和--& 1^1+2^2+3^3+……+n^n
/*防止越界的方法:把大数存在整形数组中;最终的结果放在sum数组,k^k的值存放在 result数组中。
 注意:大数在数组中存放的规...
现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
这是今天遇到的一个笔试题,当时想到的思路就是把数值和数组下标关联起来,...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

参考资料

 

随机推荐