首页 > 解决方案 > For循环在C中递归排列字符串时会产生错误

问题描述

我是 C 新手,正在尝试编写一个函数,该函数使用递归返回字符串的大小为 k 的子集的所有排列。例如,对于字符串 'abc' 和 k = 1,我会得到 'a'、'b' 和 'c',对于 k = 2,我会得到 'aa'、'ab'、'ac'、'ba '、'bb'、'bc'、'ca'、'cb' 和 'cc' 等等。

我想返回所有生成的字符串,以便我可以用它们做其他事情 - 现在它只是将它们打印出来,但我稍后会使用它们。我写了这段代码:

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

#define CHARS "abc"

char *recur(char* prefix, int k, int n);

int main(void)
{     
    int k = 2; //for example
    int n = strlen(CHARS); //set n as length of CHARS
    //print string generated by recur
    printf("string: %s\n", recur("", k, n));
}

char *recur(char *prefix, int k, int n)
{
    //if base case (have already added all letters), return string
    if (k == 0)
    {
        return prefix;
    }
    //otherwise, add character from CHARS to string
    else
    {
        for (int i = 0; i < n; i++)
        {
            // for each letter in CHARS, make a new prefix and add a letter from chars to it
            int prefLen = strlen(prefix);
            char newPrefix[prefLen + 2];
            strcpy(newPrefix, prefix);
            newPrefix[prefLen] = CHARS[i];
            newPrefix[prefLen + 1] = '\0';
            return recur(newPrefix, k-1, n);
        }
    }
}

但是,我在尝试编译时收到错误“recur1.c:40:1: error: control may reach end of non-void function [-Werror,-Wreturn-type]”。

为了进一步探索这一点,我删除了导致反转字符串的 for 循环:

char *recur(char *prefix, int k, int n)
{
    //if base case (have already added all letters), return string
    if (k == 0)
    {
        return prefix;
    }
    //otherwise, add character from CHARS to string
    else
    {
        //make a new array called newPrefix, copy current prefix into it and add new letter from CHARS
        int prefLen = strlen(prefix);
        char newPrefix[prefLen + 2];
        strcpy(newPrefix, prefix);
        newPrefix[prefLen] = CHARS[k-1];
        newPrefix[prefLen + 1] = '\0';
        return recur(newPrefix, k-1, n);
    }
}

替换第二个函数后,代码编译没有任何问题。关于为什么带有 for 循环的版本无法编译的任何想法?

标签: crecursionpermutation

解决方案


如果n <= 0,则for永远不会进入循环,因此return永远不会到达循环体中的语句。return由于循环后没有语句,编译器会抱怨(正确)。

也就是说:你确定return 在循环体内有一个无条件语句不是一个错误吗?这使得循环非常无用。


推荐阅读