我试图检查一个单词是否是回文,我正在使用递归,我不知道我做错了什么但是当我到达基本情况时,该方法继续调用最终所有单词返回false。任何人都可以帮我找到错误吗?谢谢:/
public static void main(String[] args)
{
System.out.print("Enter a word: ");
Scanner sc = new Scanner(System.in);
String isPalindrome = sc.next();
String regex = "[.!? ]";
isPalindrome.split(regex);
if(testPalindrome(isPalindrome)==true)
{
System.out.print(isPalindrome+" is a palindrome.");
}
else
{
System.out.print(isPalindrome+" is not a palindrome.");
}
}
public static boolean testPalindrome(String word)
{
if(word.charAt(0)==word.charAt(word.length()-1))
{
if(word.length()==1)
{
return true;
}
word = word.substring(1, (word.length()-1));
testPalindrome(word);
}
return false;
}
答案 0 :(得分:5)
您需要返回递归调用的结果。现在,你递归地调用函数是的,但最终,因为你在进行递归调用时没有从函数返回,所以执行流程离开了外if
语句并移到{{1即使你递归并且该行的某个地方的递归返回return false;
。
true
编辑:superhawk610对你的退出条件也是正确的。它仅对字符串中的奇数个字符有效。您应该使用类似public static boolean testPalindrome(String word)
{
if(word.charAt(0)==word.charAt(word.length()-1))
{
if(word.length()==1)
{
return true;
}
word = word.substring(1, (word.length()-1));
return testPalindrome(word);
}
return false;
}
的内容来捕捉奇数和偶数情况。这意味着最终的代码是:
if (word.length() <= 1)
答案 1 :(得分:1)
看起来它可以使用奇数长度的单词而不是长度均匀的单词。从
更改您的测试声明if(word.length() == 1)
到
if(word.length() < 2)
如果你已经减少到1个字符(奇数长度字的中间)或0(偶数长度字的“中间”),这将结束递归。
答案 2 :(得分:0)
假设您不需要检查if中的true
,因为该方法会返回boolean
System.out.print("Enter a word: ");
Scanner sc = new Scanner(System.in);
String isPalindrome = sc.next();
String regex = "[.!? ]";
isPalindrome.split(regex);
if(testPalindrome(isPalindrome))
{
System.out.print(isPalindrome+" is a palindrome.");
}
else
{
System.out.print(isPalindrome+" is not a palindrome.");
}
同样testPalindrome()
方法应该像递归一样工作。
public static boolean testPalindrome(String word)
{
if(word.charAt(0)==word.charAt(word.length()-1))
{
if(word.length()==1)
{
return true;
}
word = word.substring(1, (word.length()-1));
return testPalindrome(word);
}
return false;
}