代码输出不正确

时间:2013-12-05 17:10:12

标签: c recursion palindrome

我无法在我的代码中找到问题,只打印按任意键才能继续其他操作。由于显示的输出,我似乎没有弄清楚程序的流程。 帮助赞赏。

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

int fcheck(char *name, int i, int j)
{
    if (i > j)
        return 1;

    if (name[i] != name[j])
        return 0;
    else
        fcheck(name, i++, j--);

    return 1;
}                               // close fcheck

int main()
{
    int c;

    char name[] = "mom";

    int i = 0, j = 2;

    c = fcheck(name, i, j);

    if (c == 1)
        printf("Palindrome");
    else
        printf("Not a Palindrome");

    return 0;
}                               // close main

3 个答案:

答案 0 :(得分:2)

fcheck(name,i++,j--);

仅在调用i后更改jfcheck的值。这意味着您将获得fcheck(name,0,2)的重复调用堆栈,该堆栈仅在堆栈溢出时终止。

如果你想在这里使用递归,你需要使用预增量/减量

return fcheck(name,++i,--j);

请注意,我还在这里添加了return。如果没有这个,任何第一个和最后一个字符匹配的字符串都会被报告为回文。

答案 1 :(得分:1)

1)无限循环问题

这一行

fcheck(name,i++,j--);

应该是

fcheck(name,++i,--j);

,因为

fcheck(name,i++,j--);

相当于

fcheck(name,i,j);
i++;
j--;

因此,通过这种递增方式,您将获得无限循环,因为您正在使用相同的参数调用fcheck()

F确认(姓名,++ I, - J);

相当于

i++;
j--;
fcheck(name,i,j);

通过这种方式,您不会使用相同的参数回忆fcheck()。所以它应该解决你的无限循环问题

2)应该在递归调用后添加return

如其他答案中所述,您应该在调用递归函数时添加return

return fcheck(name, ++i, --j);

答案 2 :(得分:0)

int fcheck(char *name, int i, int j){
    if (i > j)
        return 1;

    if (name[i] != name[j])
        return 0;

    return fcheck(name, i+1, j-1);
}