不使用乘除法、switch、while、else、for、if、case等关键字以及条件判断语句(A?B:C)求1+2+3+...+n的Java代码实现和思路分享。
思路1
代码实现:
class assist { public: assist() { N++; sum += N; } static void reset() { N = 0; sum = 0; } //在VS中不需要此调用函数也可以(不进行多加一次) static unsigned int GetSum() { return sum; } private: static int N; static int sum; }; int assist::N = 0; int assist::sum = 0; //设置一个静态变量N和sum,在构造函数中进行累加运算; //然后构造一个以辅助类为类型、大小为n的数组,重复调用此构造函数n次来实现n次的累加运算 class Solution { public: int Sum_Solution(int n) { assist::reset(); assist * p = new assist[n]; delete[] p; p = nullptr; return assist::GetSum(); } }; //第二种方法:使用模板函数进行编程,显示定义输入参数为1的模块 template < int m > inline int SumTo() { return m + SumTo < m - 1 > (); } template < > inline int SumTo < 1 > () { return 1; } //第三种方法:使用虚函数 class Base; Base * Array[2]; class Base { public: virtual int Sum(int n) { return 0; } }; class Derived: public Base { public: virtual int Sum(int n) { return Array[!!n] - > Sum(n - 1) + n; } }; //使用虚函数来构造递归,在基类种定义虚函数Sum(n)返回0,通过将指针数组的两个元素分别绑定到基类和派生类,其中基类的Sum() //结束递归,!!n来构造true(1) false(0)来对指针数组进行访问 class Solution { public: int Sum_Solution(int n) { Base a; Derived b; Array[0] = & a; Array[1] = & b; return b.Sum(n); } }; //使用短路计算来构造递归:重点是输入0的时候输出0来结束递归 //缺点:递归的层数不能太深<3000 class Solution { public: int Sum_Solution(int n) { int ret = n; n && (ret += Sum_Solution(n - 1)); return ret; } };
思路2:
一、需利用逻辑和的短路特性实现递归终止。
二、在n==0的时候,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0;
三、在n>0的时候,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。
代码实现:
public int Sum_Solution(int n) { int sum = n; boolean ans = (n > 0) && ((sum += Sum_Solution(n - 1)) > 0); return sum; }
思路3:
先看我们手里有什么牌,就可以一步一步的想到利用短路特性了
我们手里目前能够使用(按优先级高低)单目运算符:++和--,双目运算符:+,-,移位运算符<<和>>,关系运算符>,<等,逻辑运算符&&,||,&,|,^,赋值=
单目和双目的作用是相同的,移位显然没有规律性,因为一个二进制位并不能区分某个数和其他数,这也就排除了&,|,^,因为不需要做位运算了
关系运算符要和if匹配,可是,这是不行的,这个时候看看剩下的运算符只能选&&,||了
假如是做过Java笔试题,会对这两个运算符非常敏感,他们有短路特性,前面的条件判真(或者假)了,就不会再执行后面的条件了
这个时候就可以联想到--n,直到等于0就能返回值。
代码实现:
public class Solution { public int Sum_Solution(int n) { int sum = n; boolean flag = (sum > 0) && ((sum += Sum_Solution(--n)) > 0); return sum; } }
思路4:
用公式是不可以的,公式里有乘法,实现乘法可以用sizeof***数组,两行代码就可以了。
代码实现:
class Solution { public: int Sum_Solution(int n) { bool a[n][n + 1]; return sizeof(a) >> 1; } };
想了解更多的Java实例吗?更多实例,可以继续关注本站的Java实例专栏了解哦。