[演算法]挑戰你思維中的牆

orchid發表於2014-10-15

這篇文章主要要解決下面幾個問題:

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的可以考慮用陣列實現選擇

相關文章