算法--实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。(详细讲解)

来源:互联网 发布:2010年流行网络歌曲 编辑:程序博客网 时间:2024/06/06 09:05

做题的时候发现了这道题。苦苦深思不得其解。在网上看到答案被其神奇之处震惊,所以特此研究并且详解。

方法一:利用构造函数和静态数据成员
此方法主要实在类中添加构造函数,及一些相关静态函数。
上图:
这里写图片描述
这里写图片描述

方法一:class Add{public:    Add()    {        ++num;        sum += num;    }    //重置,将num与sum清0    //这一步很重要,如果想要调两次构造函数,则这个方法必须要用上    static void Reset()    {        num = 0;        sum = 0;    }    static int GetSum()    {        return sum;    }private:    static int num;    static int sum;};int Add::num = 0;int Add::sum = 0;int add1(int num){    Add::Reset();    Add *a = new Add[num];    delete[]a;    a = 0;    return Add::GetSum();}

方法二:利用虚函数
思路:利用虚函数的调用性质去解决问题。
这里写图片描述
这里写图片描述

class A;A* Array[2];class A{public:    virtual int Sum(int num)    {        return 0;    }};class B:public A{public:    virtual int Sum(int num)    {        return Array[!!num]->Sum(num - 1) + num;    }};int add1(int num){    A a;    B b;    Array[0] = &a;    Array[1] = &b;    int value = Array[1]->Sum(num);    return value;}

方法三:用函数指针实现

//这里大体思想与虚函数差不多typedef int(*fun)(int);//声明一个函数指针int add1(int num){    return 0;}int add2(int num){    //fun是一个指针,定义类型为fun的数组,把数组传给函数指针的fun    fun f[2] = { add1, add2 };    //这里同样的类似于递归,递归的出口是add1.    //开始都是调用f[add2](num-1),直到num为0,调用add1.    return num + f[!!num](num - 1);}

方法四:利用&&的短路特性
方法二,方法三,以及方法四其实都是用到了递归类似的思想。
我们用这种方法详细讲一下过程。
这里写图片描述

int add(int num, int &sum){    //这里每次num都会减一,一直到num=0的时候停止。此时sum=0,num=0。并且开始逐层返回sum+=num,实现累加。    num && add(num - 1, sum);    return (sum += num);}int main(){    int num = 2;    int sum = 0;    cout << add(num,sum) << endl;    system("pause");    return 0;}
阅读全文
1 0
原创粉丝点击