[英]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
調用后,將i
和j
的值傳遞給副作用 ,並應用后增加/減少。 相反,您需要:
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.