2015-10-31 55 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

相关问题