【问题标题】:C recursive permutationsC递归排列
【发布时间】:2013-04-07 04:28:24
【问题描述】:

过去一天我一直在尝试完成这部分作业,但无济于事,需要一些帮助或指导来帮助理解问题。

到目前为止我有这个:

swap(int A, int B){
    int temp;
    temp = A;
    A = B;
    B = temp;
}


int max_array(int array[], int arraySize)
{
   int i, max=-32000;
   for (i=0; i<arraySize; i++)
   {
     if (array[i]>max)
     {
        max=array[i];
     }
   }
   printf("%d \n Max array: ", max)
   return(max);
}

int nextPermutation(int array[], int arraySize){
    int i;
    n = max_array(array, arraySize);
    if (int i; n == array[i] && i > 1; i++){
        swap(array[i], array[i-1]);
    }

    else if(int i; n == array[i]; i++){


    }
}

void main(){

    int intArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    //int intArray[10] = {1, 10, 3, 9, 8, 6, 7, 2, 4, 5};
    nextPermutation(intArray, 10);
    int i = 0;
    for(i = 0; i < 10; i++){
        printf("%d ",intArray[i]);
    }


}

但我很难理解的问题是 “如果 a1,...,an 是任意排列(其中 a1,...,an 是数字 1、2、...、n 的顺序可能不同),那么“下一个”排列由 以下程序: (i) 如果数组的最大元素(即 n)不是数组的第一个元素 数组,比如 n=ai ,其中 i>1 ,然后生成“下一个”排列 需要交换 ai 和 ai−1 。 (ii) 如果数组的最大元素在第一个位置,即 n=a1 ,那么 产生排列 (a1,...,an) 的“下一个”排列 , 首先找到 (n-1)-元素排列 (a2,...,an) 的“下一个”排列 ),然后将 a1 附加到由此获得的 (n-1) 个元素数组的末尾。"

所以它需要用 1,2,3,4,5,6,7,8,9,10 的数组排列每一个可能的组合,然后在到达这一点时完成 "(n, ..., 2 , 1). 这是 唯一没有“下一个”排列的排列。”

并且函数 int 'nextPermutation(int array[], int arraySize){' 需要保持不变。

任何帮助或提示都会很棒!

【问题讨论】:

  • 那个交换函数不会做任何事情。
  • swap 既不返回值,也不通过引用传递参数。先解决这个问题
  • main 也应该返回 int
  • 只为交换功能添加 Void 是否仍然有效?我发现的所有使用 swap 函数的例子都没有返回值,比如 void swap(int A, int B)。

标签: c recursion permutation


【解决方案1】:

你的程序有一些错误,

swap() function will not affect the program as it doesn't use pass by reference.

max_array() should find the index of the maximum value, not the maximum value itself.

There is no recursion in your program as far as I can see.

main() should return int.

下面给出的程序片段可能会给你一个想法,

    int ct=-1,n=10,temp[10]={0,0,0,0,0,0,0,0,0,0};
    int intArray[10]={1,2,3,4,5,6,7,8,9,10};

    permute(int k) 
    {     
            int i;     
            temp[k]=++ct;     
            if(ct==n-1)     
            {         
               for(i=0;i<n;i++)         
               {
                      printf("%d",intArray[temp[i]]);         
               }
               printf("\n");     
            }     
            for(i=0;i<n;i++)     
            {
               if(temp[i]==0)     
               {
                   permute(i);     
               }
            }
            ct--;     
            temp[k]=0;       
    } 

    int main() 
    {     
      permute(0);     
    }

【讨论】:

  • 感谢 deepu 我会检查您的代码片段以寻求帮助!我也将交换函数更改为: void swap(int array[],int A, int B){ int temp;温度 = 数组 [A];数组[A] = 数组[B];数组[B] = 温度;并用这个 swap(array, i, i-1); 调用它
  • 嘿,Deepu,我仍然无法理解排列递归,我一直在一遍又一遍地更改代码哈哈,但我想我只是越来越搞砸了。
  • int nextPermutation(int array[], int arraySize){ int i; int n = max_array(array, arraySize); printf("%d", n); while (arraysize 1){ swap(array, arraySize, arraySize-1);下一个排列(数组,arraySize+1);交换(数组,arraySize,arraySize-1); } else if(n == array[i]){ swap(array, arraySize, i);下一个排列(数组,arraySize+1);交换(数组,数组大小,我); } } }
  • 我刚刚通过更改部分代码重新尝试,但不确定如何使其正常工作。使用你给我的代码,它似乎永远持续下去,而且它只需要一个输入来输入函数,所以我需要能够修改它以接收 2 个输入,一个是数组,另一个是我的其他 int '不完全确定它应该是什么,因为它只指定为'arraySize',所以我不确定它是否为 10,因为数组的长度为 10 或它的其他东西。我会继续努力让它正常工作。
【解决方案2】:

交换样本

#include <stdio.h>

void swap(int* A, int* B){
    int wk;
    wk = *A;
    *A = *B;
    *B = wk;
}

int main(void){
    int array[] = { 1,2,3 };

    swap(&array[0], &array[2]);

    printf("array[0]=%d, array[2]=%d\n", array[0], array[2]);

   return 0;
}

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 2011-06-18
    • 2011-07-23
    • 2012-10-18
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多