递归函数中的逻辑错误

时间:2015-03-27 19:58:40

标签: c string recursion

我正在编写一个程序来检查字符串是否是回文或使用递归.Palindrome字符串是可以向后读取的字符串,与向前读取字符串相同。但以下是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int num;
printf("Enter the number of characters in your string\n");
scanf("%d",&num);
char string[num];
char string2[num];
int i;
printf("Enter your string\n");
for (i=0;i<num;i++)
{
    scanf("%c",&string[i]);
}
fillString(string,string2,num);
int palin = isPalind(string,string2,num);
if (palin) printf("The string you entered is palindrome");
else printf("The string you entered is not palindrome");

return 0;
}

int isPalind(char string[],char string2[],int num)
{
int i=0;
while (i<num)
{
    if (string[i]!=string2[i])
    {
        i++;
        return 0;

    }
    else{

        i++;
        return 1*isPalind(string,string2,num);

    }
}

}

void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<num;i++)
    string2[i-1]=string[num-i];

}

我有一个逻辑错误,程序编译好并执行但它总是发出“字符串不是回文”

3 个答案:

答案 0 :(得分:1)

fillString中,循环正在迭代num-1次(i1num-1),因此不会复制整个字符串。省略原始字符串的第一个字符。你应该做

for (i=1;i<=num;i++) ...

至于递归函数,它实际上并不是递归的。在递归调用中,应该传递修改输入,但在您的情况下,传递完全相同的输入。因此,如果是真正的回文,很可能由于非终止而导致堆栈溢出。我会提出另一种方法,递归地使用单个字符串:
1)基本情况:如果长度为0或1,则字符串为回文结构 2)递归步骤:如果第一个字符等于最后一个字符串没有,则字符串是回文,最后一个字符是回文。

答案 1 :(得分:0)

这两个功能都是错误的。它们可以按以下方式编写

int isPalind( const char string[], const char string2[], int num )
{
    return ( num == 0 ) || 
           ( string[0] == string[--num] && isPalind( string + 1, string2, num ) ); 

}

void fillString( const char string[], char string2[], int num )
{
    int i;
    for ( i = 0; i < num; i++ ) string2[i] = string[num-i-1];
}

如果您不需要递归函数,那么您可以使用简单的函数memcmp来确定两个字符串是否相等。

答案 2 :(得分:0)

你的fillString()函数是否按预期反转你的字符串?看起来string1的第一个字母没有被添加到string2的最后一个位置,因为for循环在i&lt; num失败。尝试将其切换到i&lt; = num并查看是否有帮助。

仔细检查此示例:

给定:String1 =“Hello”。 String2 =现在为null。 num = 5。

void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<num;i++)
    string2[i-1]=string[num-i];

}

当i = 4时,你有string2 ='olle'。当i = 5时,for循环条件失败,因此它不会填充string2 [4] ='H'。

更新

void fillString(char string[],char string2[],int num)
{
int i;
for (i=1;i<=num;i++)
    string2[i-1]=string[num-i];

}