C - 按字典顺序的递归排列

标签 c recursion permutation alphabetical lexicographic

我正在尝试对最多 8 个字符的字符串进行排列。问题是它必须通过递归完成,并且必须按字典顺序排列。我找到了一种递归解决方案,但它最多只适用于 4 个字符。之后,它又开始困惑。

void swap(char* a, char* b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

void recursion(char* arr, int start, int n){
    if (start == (n-1)){
        printf("%s\n", arr);
        return;
    }

    for (int i = start; i < n; i++){
        recursion(arr, start+1, n);
        swap(arr+start+1, arr+n-1);
        int j = start+1;
        while (j < n && arr[start] > arr[j]){
            j++;
        }

        if (j >= n){
            continue;
        }
        swap(arr+start, arr+j);
    }
    swap(arr+start+1, arr+n-1);
}

int main(int argc, char *argv[]) {
    char arr[9];
    char charakter;
    int m = 0;
    while (scanf("%c", &charakter) != EOF){
        if (charakter == '\n'){
            break;
        }
        else if (isalpha(charakter) || isdigit(charakter)){
            arr[m] = charakter;
            m++;
        }

        else{
            fprintf(stderr, "Error!\n");
            return 100;
        }        
    }

    arr[m] = '\0';

    int n = strlen(arr);
    int start = 0;
    recursion(arr, start, n);
    return 0;
}

知道如何修复递归函数吗?

最佳答案

你的解决方案很奇怪,看看here这里有一个修复:

void recursion(char *arr, int start, int n) {
  if (start == n) {
    printf("%s\n", arr);
    return;
  }

  for (int i = start; i < n; i++) {
    swap(arr + start, arr + i);
    recursion(arr, start + 1, n);
    swap(arr + start, arr + i);
  }
}

这里有一个正确的解决方案:

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

static void recursion(char *str, size_t n, size_t max) {
  if (n < max) {
    recursion(str, n + 1, max);
    for (size_t i = n + 1; i < max; i++) {
      char tmp = str[i];
      str[i] = str[n];
      str[n] = tmp;
      recursion(str, n + 1, max);
      str[n] = str[i];
      str[i] = tmp;
    }
  } else {
    printf("%s\n", str);
  }
}

int main(void) {
  char str[42];
  errno = 0;
  if (scanf("%41s", str) != 1) {
    if (errno != 0) {
      perror("scanf()");
    } else {
      fprintf(stderr, "no input");
    }
    return 1;
  }

  recursion(str, 0, strlen(str));
}

关于C - 按字典顺序的递归排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41651983/

相关文章:

list - 在 NetLogo 中生成列表的排列

c - 数组名称在 C 中衰减为指针 - 编译错误

c - 通过 union 别名

c++ - 递归传递动态变量的内存泄漏

c++ - 程序在控制台中挂起,同时在 C++ 中提供较大的输入大小

python - <function>(str1, str2) 分别调用它们

c++ - 我有 n 个空格,在每个空格中,我可以放置一个 0 到 m 的数字。编写程序输出所有可能的结果。需要帮助 :)

c++ - C++中具有输出限制的排列

c - C 中的 Blob 检测(不适用于 OPENCV)

c++ - 微软 C/C++ : what is the definition of "strict conformance" w. r.t.执行?