如果单词是一个字母,我的回文程序只给出一个真实的。即使我使用合适的回文,所有其他选项都会出错。我不知道问题是我使用s.length还是什么。代码如下:
package palindrome;
import java.util.Scanner;
public class Palindrome {
static String pal; //entered string
static int n = 0; //used to control substrings
static boolean isPalindrome; //boolean to control if the string is a palindrome
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//create scanner
System.out.print("Enter a string: ");
pal = scan.nextLine(); //turn input into string
palindrome(pal); //use palindrome method
if (isPalindrome == true) { // if it is palindrome, use this message
System.out.println("The string is a palindrome");
} else { //if not, use this method
System.out.println("The string is not a palindrome");
}
}
static boolean palindrome(String s) {
int m = s.length() - 1; //use this int to create the upper limit for string
switch (s.length()) {
case 1: // if the word is one letters, it is a palindrome
isPalindrome = true;
break;
case 2: //if the word is two letters, compare the two letters to determine if it is a palindrome
if (s.charAt(0) == s.charAt(1)) {
isPalindrome = true;
} else {
isPalindrome = false;
}
break;
default: //recursively determine if it is a palindrome
if (s.charAt(n) == s.charAt(m)) {
palindrome(s.substring(n++, m));
} else {
isPalindrome = false;
}
break;
}
return isPalindrome; //return the boolean
}
}
编辑:我编辑了它并通过了调试器。由于一些奇怪的原因,它通过并获得isPalindrome是真的,但然后再次回到循环,我不明白为什么。
public class Palindrome {
static String pal; //entered string
static int n = 0; //used to control substrings
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//create scanner
System.out.print("Enter a string: ");
pal = scan.nextLine(); //turn input into string
palindrome(pal); //use palindrome method
if(palindrome(pal) == true) // if it is palindrome, use this
message
{
System.out.println("The string is a palindrome");
}
else //if not, use this method
{
System.out.println("The string is not a palindrome");
}
}
static boolean palindrome(String s)
{
boolean isPalindrome = false;
switch (s.length()) {
case 1: // if the word is one letters, it is a palindrome
isPalindrome = true;
break;
case 2:
if(s.charAt(0) == s.charAt(1))
{
isPalindrome = true; break;
}
else isPalindrome = false; break;
default: //recursively determine if it is a palindrome
if (s.charAt(0) == s.charAt(s.length()-1))
{palindrome(s.substring(1, s.length()-1));}
else
{isPalindrome = false;}
break;
}
return isPalindrome; //return the boolean
}}
答案 0 :(得分:1)
递归实现的问题在于它使用静态变量。这总是一个需要修复的坏迹象:删除isPalindrome
静态变量,并用同名的局部变量替换它。
现在已完成此操作,请更改最后一种情况,以返回palindrome(s.substring(n+1, m))
返回的值以解决问题。
注意:您可以优化代码结构,只有两种情况 - 基本案例和递归案例,而不是三种情况(一个字母,两个字母,两个以上的字母)。这也将修复传递空字符串导致的崩溃,因为您当前的代码在default
情况下处理它。
对于长度小于2的字符串,基本情况应返回true
。递归案例应继续以default
案例的方式运作;请注意,它也适用于两个字母,因为空的“中间”字符串作为回文正确处理。
答案 1 :(得分:0)
就像已经提到的@dasblinkenlight一样,基本问题是你在一个recureive方法中使用静态字段。您对palindrome -method的每次调用都使用相同的字段变量。字段值在每次递归调用时都会发生变化。如果要使用递归,则应该在参数中发送方法的所有状态信息。
总的来说,这是一个检查如何设计算法的好例子。递归算法可以非常强大,但在许多情况下,同样的事情可以更简单,更健壮的方式实现。
以下是使用相同技巧的较短版本的示例:
public static boolean isPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while (i <= j) {
if (s.charAt(i++) != s.charAt(j--))
return false;
}
return true;
}
此示例使用空字符串作为回文。另外值得一提的是,在生产代码中还应该对param进行空检查。