我对此有疑问
public class Palindrom
{
public static boolean isPalindrom(String text)
{
boolean back = true; //return variable
text = text.replaceAll("\\s","");
//checking special cases - text.length() = 0 or 1
if (text.length() <= 1)
{
if (text.length() == 0)
{
System.out.println("An empty string cannot be a palindrom");
back = false;
}
else
{
//checking if the single String-element is a letter
if (Character.isLetter(text.charAt(0)) == true)
{
System.out.println("An single-character string - given that it is a valid word - is always a palindrom");
back = true;
}
else
{
System.out.println("The String contains something that isn't a letter 1");
back = false;
}
}
}
else
{
text = text.toLowerCase();
//now we always have to check if the first and last element are letters and if they're equal
if ((Character.isLetter(text.charAt(0)) && Character.isLetter(text.charAt(text.length() - 1))) == true)
{
//TEST
//System.out.println("Checks if letters");
if (text.charAt(0) == text.charAt(text.length() - 1))
{
back = true;
//now we have to the recursive calling
text = text.substring(1,text.length() - 1);
//if the cut String has a length = 0, then there is no need to call the method again
if (text.length() != 0)
{
//TEST
System.out.println("Calls the method again");
Palindrom.isPalindrom(text);
}
//else: we're finished
}
else
{
back = false;
}
}
else
{
System.out.println("The String contains something that isn't a letter 2");
back = false;
}
}
System.out.println("four");
System.out.println("back is : " + back);
System.out.println("five");
return back;
}
}
现在如果我用例如方法调用方法“adba”作为文本,然后我将其作为控制台输出:
Calls the method again
four
back is : false
five
four
back is : true
five
true
但事情是“ System.out.println(”后面是:“+后退”“只被调用一次,返回值似乎又变回了前一个。 任何想法该怎么办?
答案 0 :(得分:1)
除非您有要求(我的意思是,除非您正在尝试学习递归)编写自己的算法,否则以下标准库将解决问题:
public boolean isPlanidrom(String planidrom) {
StringBuilder original = new StringBuilder(planidrom);
String reverse = original.reverse().toString();
return planidrom.equalsIgnoreCase(reverse);
}
示例:
System.out.println(isPlanidrom("Madam"));
System.out.println(isPlanidrom("hello olleh"));
将打印:
true
true
答案 1 :(得分:0)
您需要将递归调用结果分配给外部调用
尝试更改
Palindrom.isPalindrom(text);
到
back= Palindrom.isPalindrom(text);
答案 2 :(得分:0)
只需更改此行
即可Palindrom.isPalindrom(text);
到这一行
back= Palindrom.isPalindrom(text);
原因:因为您的代码行不存储back的值并调用自身。保存返回后面变量的值。
答案 3 :(得分:0)
这里的问题是你以递归方式调用这个方法,而方法本身就是打印出结果,这是糟糕的设计。如果要将参数传递给此方法并从命令行调用它,则需要将所有System.out.println()放入main方法中:
public static void main(String[] args){
System.out.println("four");
System.out.println("back is : " + Palindrom.isPalindrom(args[0]) );
System.out.println("five");
}
这样,每次调用时,递归方法都不会运行所有这些print语句。另一个举措是改变第54行
Palindrom.isPalindrom(text);
到
back = back && Palindrom.isPalindrom(text);
编辑:不要简单地写
back = Palindrom.isPalindrom(text);
这样可以获得最近一次调用方法的值,而不是所有调用AND的值。
现在你编译你的类并调用
java Palindrom "racecar"
从命令行,你应该看到你期望的结果:
4
再次调用该方法
再次调用该方法
再次调用该方法
单字符串 - 假定它是一个有效的单词 - 总是一个palindrom
回来是:真的
5
那应该让你到达你需要去的地方!
注意:如果您将此作为学校或雇主的代码练习提交,您应该知道向前和向后拼写相同的单词称为“Palindrome”,但拼写不是会影响代码的性能。