题目来自剑指Offer
题目:
思路(1):可以使用递归,而且终止条件必须是隐含的。
代码:
#include <iostream> using namespace std; int Sum(int n) { int m = 0; n && (m = Sum(n - 1) + n); return m; } int main() { cout<<Sum(5)<<endl; system("pause"); return 1; }
思路(2): 静态变量 + 构造函数
代码:
#include <iostream> using namespace std; class Sum { public: Sum() { m_nNum++; m_nTotal += m_nNum; } static int GetSum() { return m_nTotal; } private: static int m_nNum; static int m_nTotal; }; int Sum::m_nNum = 0; int Sum::m_nTotal = 0; void main() { Sum* pSum = new Sum[10]; cout<<Sum::GetSum()<<endl; system("pause"); }
思路(3):利用虚函数
代码:
#include <iostream> using namespace std; class Base; Base* pBase[2]; class Base { public: virtual int Sum(int n) { return 0; } }; class Derive : public Base { public: int Sum(int n) { return pBase[!!n]->Sum(n - 1) + n; } }; int main() { Base b; Derive d; pBase[0] = &b; pBase[1] = &d; cout<<pBase[1]->Sum(5)<<endl; system("pause"); return 1; }
由于pBase是基类类型的指针,它指向派生类的虚函数时,能发生多态。在n有1变化到n时,都是调用的派生类的sum函数。直到n=0时,会调用基类的函数,而返回0。这里把基类的sum函数看出类似递归的终止条件了。