一步一步寫演算法(之資料選擇)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    在數學中,有一些資料選擇的內容。舉個例子來說,有這樣一組資料:1、2、3、4。現在我們打算從中挑選出1個資料,那麼有幾種選擇呢?結果應該是1、2、3、4;那麼如果挑選2個資料呢,怎麼選呢?那麼結果應該是12、13、14、15。以此類推,我們還能挑選出3個資料、4個資料的情況。

    那麼,在程式上面應該怎麼表示呢?其實可以使用遞迴的方法。請大家和我一起計算一下:

    如果需要從1、2、3、4中挑選兩個資料,那麼是不是先從1開始,然後再2、3、4中挑選一個資料,這樣可以有12、13、14三種情況。接著呢,我們從2開始,下面可以選擇的資料只有從3、4中選擇了,1不能選擇了,否則會產生重複選項。以此類推,那我們從4開始的時候,發現4後面沒有資料的時候,此時迭代終止。

    挑選2個資料如此,那麼挑選n個資料是不是也是這樣呢?首先選出第1個資料,那麼剩下來的資料只能從這個資料後面位置開始挑選,如果挑選出n-1個資料,那麼表示n個資料存在,繼續尋找到,直到n-1個資料選不出來為止;接著我們移動第一個資料的位置,同樣需要在當前資料的後面挑選n-1個資料。以此類推,如果我們發現當前資料後面連n-1個資料都沒有了,那麼表示遞迴就結束了。

    下面我們就可以書寫代碼了。

    a)
定義全域空間和列印函數,儲存已經遍曆的資料

static int gAllData[MAX_NUMBER]= {0};static int gTotal = 0;void print(int pData[], int length){int index;for(index = 0; index < length; index++)printf("%d", pData[index]);printf("\n");}

    b)開始資料的迭代

void traverse(int pData[], int length, int number){int index;if(0 == length)return;for(index = 0; index < length; index++){gAllData[gTotal ++] = pData[index];if(1 == number)print(gAllData, gTotal);elsetraverse(pData + (index + 1), length - (index + 1), number -1);gAllData[-- gTotal] = 0;}}

    c)編寫測試案例,驗證結果

void test(){int data[] = {1, 2, 3, 4, 5, 6};memset(gAllData, 0, sizeof(int) * MAX_NUMBER);traverse(data, sizeof(data)/sizeof(int), 4);}

   註:我們可以通過不停修改數組data和數值number的方法,驗證列印出來的資料和我們自己計算的結果是否有出入。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.