【问题标题】:Making a permutation function that outputs all possible permutations of array?制作一个输出数组所有可能排列的排列函数?
【发布时间】:2015-10-31 17:33:06
【问题描述】:

我已经看到了一些如何做到这一点的例子,比如这个:

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 输出的函数....例如:

void Permutations(int* items, const int& size, ostream& out)

我无法仅用尺寸来解决如何做到这一点,究竟要如何做到这一点?

【问题讨论】:

  • 你是什么意思“只是大小”?
  • 是否有特殊原因要去掉 curr 作为函数参数?
  • std::next_permutation 是一个很好的起点。
  • 你这样做:void Permutations(char * arr, int size) { return permutation(arr, 0, size) }。在这里,函数Permutations 只接受数组及其大小。如果需要,您可以添加 ostream 参数。
  • 这使得你什么时候可以修改size变量,但是什么时候声明size为const呢?

标签: c++


【解决方案1】:

这背后的想法是将每个字符与最后一个字符交换,然后在同一个字符串上再次调用 permutation,但大小要小 1。因为我们使用 size 参数来跟踪我们正在处理的子字符串, arr 必须为空终止。如果需要,您可以轻松地将函数更改为具有额外的 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) );
}

【讨论】:

  • 这使得你什么时候可以修改size变量,但是什么时候声明size为const呢?
猜你喜欢
  • 2017-11-26
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多