這篇文章主要要解決下面幾個問題:
1,如何不用迴圈實現迴圈?
2,如何不用if else for while switch A?B:C實現選擇?
3,如何不用+-*/實現+?
---------------------------------
Queston 1:
不用乘除法,for whiel if else switch case A?B:C求1+2+3+4+..+n.
Solution 1-1:
通常情況下我們用迴圈很容易實現1+2+..+n,正是因為很容易實現,所以當禁止我們使用常見方法時,我們的大腦就短路了。這時候我們該考慮問題的本質,迴圈的本質是什麼?其實是一條語句sum=sum+i被執行了n次。而語言裡面的迴圈語句只是實現這一目的的一種手段而已。還有什麼手段讓一條語句自動的被執行n次?物件陣列 Obj* myobjes=new Obj[n]; 在這語句裡n個Obj類被建立了,可以把語句寫在建構函式裡。程式碼如下:
#include <iostream> using namespace std; class SumByClass { public: static unsigned int sum; static unsigned int n; SumByClass() { n++; sum+=n; } static int getSum() { return sum; } }; unsigned int SumByClass::n=0; unsigned int SumByClass::sum=0; unsigned int getSum(int n) { SumByClass* sco=new SumByClass[n]; return SumByClass::sum; }
Solution 1-2:
還可以用遞迴實現1+2+...+n,f(n)=f(n-1)+1,但是有一個問題,遞迴的返回怎麼辦?我們通常if(n==1) return 1就返回了。破解的思路與上面有點類似,陣列,不同的語句寫在不同的陣列裡,用陣列的哪一項,這不是很容易確定的是嗎?程式碼如下:
typedef int (*fun)(int); int sum1(int); int sum2(int); fun myFun[2]={sum1,sum2}; int sum1(int n) { return 0; } int sum2(int n) { return n+myFun[!!n](n-1); }
總結:
1,當遇到運算有關的,還禁止用+-*/的,可以往位運算方面考慮
2,當遇到分支選擇,還禁止用if else while for switch A?B:C的可以考慮用陣列實現選擇