2015-10-31 61 views
0

我見過一些例子,如何做到這一點,比如這個:做一個排列函數,輸出所有可能的數組排列?

void permutation(char * arr, int curr, int size) 
{ 
    if(curr == size-1) 
    { 
    for(int a=0; a<size; a++) 
     cout << arr[a] << "\t"; 
    cout << endl; 
} 

    else 
    { 
    for(int i=curr; i<size; i++) 
    { 
     swap(&arr[curr], &arr[i]); 
     permutation(arr, curr+1, size); 
     swap(&arr[curr], &arr[i]); 
    } 
    } 

}

不過,我試圖讓一個函數,只需要在陣列中的大小和一個ostream輸出的置換函數....例如:

無效排列組合爲(int *項目,const int的&大小,ostream的&出)

我不能換我圍​​繞如何頭至只用大小來做,一個人怎麼會這樣做呢?

+0

你是什麼意思 「只是大小」? –

+0

有沒有特別的理由想要擺脫'curr'作爲函數參數? –

+1

'std :: next_permutation'是一個很好的起點。 – dasblinkenlight

回答

0

這個想法背後是將每個字符與最後一個字符進行交換,然後在同一個字符串上再次調用置換,但尺寸小於1.因爲我們使用size參數來跟蹤大小我們正在處理的子字符串中,arr必須以null結尾。如果需要,您可以輕鬆更改該功能以獲得額外的ostream參數。

大小值在開始時改變,而不是在新調用中更改以允許優雅的sizeof(str)語法。

Live on Coliru

#include <iostream> 

void swap(char* f, char* t){ 
    char temp = *f; 
    *f = *t; 
    *t = temp; 
} 

void permutation(char arr[], int size) 
{ 
    --size; 

    if(size == 0){ 
     std::cout << arr << std::endl; 
     return; 
    } 

    for(int i=0; i < size; i++) 
    { 
     swap(&arr[size - 1], &arr[i]); 
     permutation(arr, size); 
     swap(&arr[size - 1], &arr[i]); 
    } 
} 

int main(){ 
    char str[] = "0123"; 

    permutation(str, sizeof(str)); 
} 
+0

它使得當你可以修改大小變量時,但是當大小被聲明爲const時呢? – Armbrust

相關問題