我的老师要求我们创建两种方法来确定字符串是否是回文。 一个必须是一个递归方法,另一个必须是一个迭代方法,我已经找到了迭代版本,但我不知道如何使它成为一个递归方法。 欢迎任何和所有帮助。谢谢
static boolean isPalindrome(String s)
{
String noSpaces = s.replaceAll("\\W", ""); //remove all non-word chars from string
String revString = ""; //store reversed string
//for loop working from outter chars to inner
//to reverse the string
for(int i = 1; i <= noSpaces.length(); i++)
{
//if true add char to revString String
if(noSpaces.charAt(i - 1) == noSpaces.charAt(noSpaces.length() - i))
revString = revString + noSpaces.charAt(i - 1);
}
//return true if original string matches reversed string
if(noSpaces.equals(revString))
return true;
else
return false;
}
答案 0 :(得分:1)
创建一个带有字符串的递归方法,并返回类似迭代方法的布尔值。
它将检查第一个和最后一个字符,如果它们不同则返回false
,
如果它们是同一个调用并返回方法,并将第一个和最后一个字符作为参数取消
如果是单个字符或空字符串,则返回true
。
关于迭代方法的提示:
区分大小写是否重要?
虽然你的方法是一种方法,但另一种方法只需要检查一半的字符串(不是从1
到noSpaces.length()
)。
答案 1 :(得分:1)
递归通过调用自身的方法工作。一个着名的递归示例是阶乘:n! = n * (n-1)!
。递归有效,因为输入每次都会改变;如果没有,它基本上是一个占用内存并最终导致程序崩溃的无限循环。关于递归的最后一件事:有一点是答案是已知的,例如对于阶乘,0! = 1
。递归方法需要给出这个已知值的答案,否则它将一直持续到它崩溃或抛出错误(因为被问到一个不可能的事情)。在你的例子中,你知道如果它有一个char或两个字符完全相同的东西是回文。
递归:你想要的方法是取一个String,执行replaceAll去除非单词字符,(添加一个.toLowerCase()),然后检查第一个和最后的字符,看看它们是否相同。如果是,则再次运行该方法,输入为noSpaces
,并删除第一个和最后一个字符。但是,如果String的长度是&lt; = 3并且第一个和最后一个字符相同,那么您可以继续并返回true。如果你不添加它,当你试图删除不存在的字符时会出现错误(虽然有另一种方法)。
你的迭代方法很大,你可以减少它。你不需要检查所有的字符,只需要检查一半(如果你有奇数长度,那么1/2 + 1)。您也不需要复制String,而是在同一个String上使用两个charAt方法。
编辑:我删除了我的代码,因为这是作业。如果您真的需要查看它,请查看编辑历史记录
答案 2 :(得分:1)
试试这个:
public static boolean palindrome(String Str){
if(Str.length()<=0)
return true;
if(Str.charAt(0)!=Str.charAt(Str.length()-1))
return false;
else
return palindrome(Str.substring(1,Str.length()-1));
}