我正在尝试用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;
}
答案 0 :(得分:1)
问题是你传递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)
如果您可以在不使用递归的情况下实现所需内容,请执行以下操作。将单词读入列表中,然后将该单词翻译成另一个列表,如果匹配,则表示您有一个回文。
答案 2 :(得分:0)
修改后的代码:
1)如果第一个索引是0,那么最后一个索引应该是strlen(chaine) - 1
2)您在递归调用中传递了相同的i和j值,需要使用预增量和后增量运算符。
#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;
}
答案 3 :(得分:0)
您的递归有几个问题。首先,i++
和j--
传递i
和j
的值,并在下次调用后将后增量/减量应用为副作用至palindrome
已经完成。相反,你需要:
return palindrome (c, i + 1, j - 1);
接下来,如果chaine
的偶数个字符会发生什么? i
永远不等于j
。您需要更新测试以中断递归:
if (j <= i)
return 1;
最后,当您使用palindrome
在main()
中呼叫strlen(chaine)
时,您正试图阅读 nul-terminatedating 字符,而您需要:
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
(好奇,是“男人计划运河巴拿马”)