我第一次学习递归,我在使递归函数工作时遇到了问题。基本上我必须看看是否可以通过连接其他字符串来创建一个字符串(来自命令行)。如果可能,该函数将返回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;
}
答案 0 :(得分:0)
您想知道是否可以从其他字符串中创建一个特定字符串,即目标。
我不确定你是如何计划你的递归的(你的代码不是很清楚),但它看起来太复杂了。例如,您不需要任何临时存储。
您认为需要选择最长前缀的假设也是错误的。例如,如果你想从“hel”,“helm”和“met”制作“头盔”,当你选择最长的匹配“helm”时,你将排除解决方案“hel·met”。递归解决方案的好处在于它可以让您轻松地追求所有可能的途径。
您的递归如何运作?扫描所有字符串并检查它们是否可以作为目标的前缀。如果是,请通过递归调用函数来检查目标减去该前缀是否可以由字符串组成。如果没有前缀匹配,则返回false。如果在取消前缀后目标为空,则返回1.
每个递归级别都保留其局部变量,因此在从函数返回到最后一级后,您将追溯并再次开始测试原始字符串(该级别)。
将字符串中的当前位置向下传递到下一个递归级别。这是一个有效的配置,但C字符串的一个很好的属性,它实际上只是字符串数组,是你可以通过移动指针{{{{}}}轻松地从字符串len
剪切长度str
的前缀。 1}}字符向右,只要你不穿过空分隔符。所以字符串的其余部分只是len
。
这是一个从命令行获取所有字符串的变体。第一个字符串是目标字符串。
str + len