繁体   English   中英

C递归功能回文

[英]C recursive function palindrome

我正在尝试使用C做一个递归函数,以检查一个单词是否是回文(以两种方式读取)。

这是我第一次使用这种功能,但是我有一个问题,我不知道为什么它不起作用,如果可以的话,有我的代码,谢谢:

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

int palindrome(char c[100],int i, int j)
{
    if (j == i)
    {
        return 1;
    }

    // Si le premier et le dernier caractère
    // sont les mêmes alors, on peut commencer les tests
    if(c[i] == c[j])
    {
        // On fais les tests pour chaque caractère de la chaine
        return palindrome(c, i++, j--);
    } else {
        return 0;
    }

    return 0;
}

int main(void)
{
    char chaine[100] = "radar";
    int pal;

    pal = palindrome(chaine, 0, strlen(chaine)); // Returns : 0 -> False / 1 -> True
    printf("%d", pal);
    return 0;
}

问题是您将j值传递为strlen(chaine)而不是strlen(chaine)-1。

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

int palindrome(char c[100],int i, int j) {
    if (j == i)
        return 1;
    else if(c[i] == c[j])
        return palindrome(c, ++i, --j);
    else
        return 0;
}

int main() {
    char chaine[100] = "radar";
    int pal;
    pal = palindrome(chaine, 0, strlen(chaine) -1 ); // Returns : 0 -> False / 1 -> True
    printf("%d", pal);
    return 0;
}

如果不使用递归就可以实现所需的结果,请执行以下操作。 将单词读入列表中,然后将其反转到另一个列表中,如果它们匹配,则说明您有回文。

修改后的代码:
1)如果第一个索引为0,则最后一个索引应为strlen(chaine)-1。
2)您在递归调用中传递了相同的i和j值,您需要使用pre-incre和post-increment运算符。

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

int palindrome(char c[100],int i, int j)
{

    if (j == i)
    {
        return 1;
    }

    if(c[i] == c[j]) // Si le premier et le dernier caractère sont les mêmes alors, on peut commencer les tests
    {

        // On fais les tests pour chaque caractère de la chaine
        // increment and decrement first 
        // You were passing same values every time (0 and 4)
        return palindrome(c, ++i, --j);

    }
    else
    {
        return 0;
    }

    return 0;

}

int main()
{

    char chaine[100] = "radar";
    int pal;
    // Last index should be strlen(chaine) - 1
    pal = palindrome(chaine, 0, strlen(chaine)-1); // Returns : 0 -> False / 1 -> True
    printf("%d", pal);

    return 0;

}

您的递归有几个问题。 首先, i++j--在下一次调用palindrome调用后,将ij的值传递给副作用 ,并应用后增加/减少。 相反,您需要:

        return palindrome (c, i + 1, j - 1);

接下来,如果chaine 的字符数为偶数,该怎么办? i从不等于j 您需要更新测试以中断递归至:

    if (j <= i)
        return 1;

最后,当您使用strlen(chaine)main()调用palindrome时,您尝试读取n 终止字符,而您需要:

    pal = palindrome (chaine, 0, strlen (chaine) - 1);

放在一起,您可以执行以下操作:

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

int palindrome (const char *c, int i, int j)
{
    if (j <= i)
        return 1;

    if (c[i] == c[j])
        return palindrome (c, i + 1, j - 1);

    return 0;
}

int main (int argc, char **argv) {

    char *chaine = argc > 1 ? argv[1] : "radar";
    int pal;

    pal = palindrome (chaine, 0, strlen (chaine) - 1);

    printf ("chaine : '%s' %s a palindrome\n", chaine, pal ? "is" : "is not");

    return 0;
}

使用/输出示例

$ ./bin/recursive_palindrome
chaine : 'radar' is a palindrome

$ ./bin/recursive_palindrome amanaplanacanalpanama
chaine : 'amanaplanacanalpanama' is a palindrome

$ ./bin/recursive_palindrome catfish
chaine : 'catfish' is not a palindrome

(出于好奇,是“男人计划运河巴拿马”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM