检查是否可以通过在C中连接较小的字符串(递归函数)来生成字符串

时间:2015-11-30 15:18:37

标签: c

我第一次学习递归,我在使递归函数工作时遇到了问题。基本上我必须看看是否可以通过连接其他字符串来创建一个字符串(来自命令行)。如果可能,该函数将返回1,否则返回0。

这是我写的代码(对不起,我没有编码和制作相当糟糕的代码,我甚至无法调试它,所以我看不出我错在哪里。)

int decomposition(char* argv[],char** strings,int pos,int strings_num){
int i,j,flag=0,flag2=0,tmp=pos,pos2;
char* comp;
char* comp1;
if(pos >= strlen(argv[1]))
    return 1;
for(i = 0;i<strings_num;i++){
    comp = malloc((strlen(strings[i])+1)*sizeof(char));
    comp1 = malloc((strlen(strings[i])+1)*sizeof(char));
    strcpy(comp,"a");
    flag = 0;
    pos = tmp;
    while(strlen(strings[i])<=strlen(argv[1])-pos){
        for(j = 0;j<strlen(strings[i]);j++){
            if(strings[i][j] == argv[1][pos]){
                comp1[j] = argv[1][pos];
                pos++;
                flag = 1;
            }
            else{
                flag = 0;
                break;
            }
        }
    }
    if(flag == 1 && strlen(comp1)>=strlen(comp)){     //comp1 must be longer than comp...if the string is "hello" between string1="he" and string2="hel" I have to choose string2
        strcpy(comp,comp1);
        pos2 = pos;                     
        flag2 = 1;
    }
}

这里我有递归调用的问题...我知道有什么不对,但我不知道如何纠正它......

if(flag2 == 1){
    if(decomposition(argv,strings,pos2,strings_num)==1)
        return 1;
    else
        return 0;
}
else
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您想知道是否可以从其他字符串中创建一个特定字符串,即目标。

我不确定你是如何计划你的递归的(你的代码不是很清楚),但它看起来太复杂了。例如,您不需要任何临时存储。

您认为需要选择最长前缀的假设也是错误的。例如,如果你想从“hel”,“helm”和“met”制作“头盔”,当你选择最长的匹配“helm”时,你将排除解决方案“hel·met”。递归解决方案的好处在于它可以让您轻松地追求所有可能的途径。

您的递归如何运作?扫描所有字符串并检查它们是否可以作为目标的前缀。如果是,请通过递归调用函数来检查目标减去该前缀是否可以由字符串组成。如果没有前缀匹配,则返回false。如果在取消前缀后目标为空,则返回1.

每个递归级别都保留其局部变量,因此在从函数返回到最后一级后,您将追溯并再次开始测试原始字符串(该级别)。

将字符串中的当前位置向下传递到下一个递归级别。这是一个有效的配置,但C字符串的一个很好的属性,它实际上只是字符串数组,是你可以通过移动指针{{{{}}}轻松地从字符串len剪切长度str的前缀。 1}}字符向右,只要你不穿过空分隔符。所以字符串的其余部分只是len

这是一个从命令行获取所有字符串的变体。第一个字符串是目标字符串。

str + len