рекурсия функции палиндрома - PullRequest
0 голосов
/ 17 января 2012

Кто-нибудь поможет мне выяснить, что не так с моей функцией isPalindrome (int)?

В основном эта функция проверяет, является ли число палиндромом, и я хотел сделать это с помощью рекурсии.Некоторая проблема возникает при вызове isPalindrome (int) внутри функции.Это принесло мне много головной боли.Спасибо!

public boolean isPalindrome(int num) {
    String s = Integer.toString(num);
    if( s.length() == 1 ) {
    return true;
}
if( s.length() == 2 && s.charAt(0) == s.charAt(1) ) {
    return true;
}
if( s.length() > 2 ) {
    if(s.charAt(0) == s.charAt(s.length()-1))
        s = s.substring(1, s.length()-1);
        **isPalindrome(Integer.parseInt(s));**
}
return false;
}

Ответы [ 5 ]

2 голосов
/ 17 января 2012

В этой части вашего кода

       if(s.charAt(0) == s.charAt(s.length()-1))
         s = s.substring(1, s.length()-1);
        **isPalindrome(Integer.parseInt(s));**

Вы не дали еще для условия, когда первый и последний символы не равны.Вы должны вернуть false, когда они не равны.А также 'return' isPalindrome (Integer.parseInt (s)), иначе последний возврат будет выполнен после выполнения функции.

     if(s.charAt(0) == s.charAt(s.length()-1)) {
         s = s.substring(1, s.length()-2);
         return isPalindrome(Integer.parseInt(s));
     } else {
       false;
     }
1 голос
/ 17 января 2012

Вы должны return isPalindrome(Integer.parseInt(s));, а не просто вызывать его.

Если вы этого не сделаете, когда вы вернетесь из рекурсии, вы выйдете из последней области if и return false, независимо от того, что вернул рекурсивный вызов.

0 голосов
/ 17 января 2012
public class Recursion {
    public static String Palindrome(int length)
        {
        //Alphabet to pick letters from
        String alpha="abcdefghijklmnopqrstuvwxyz";
        String s="";
        String sBackwards=" ";
        if(length==0) {
            sBackwards+=reverse(s);
            return sBackwards;
            //recursion over-rides sBackwards
        } else {
            Random r = new Random();
            //places a char from alpha into s
            s+=(alpha.charAt((int)r.nextInt(26)));
            System.out.print(s);
            return Palindrome(length-1); //recursion
        }
    }
    public static void main(String args[])
    {
        System.out.println(Palindrome(10));
    }
}
0 голосов
/ 17 января 2012

Похоже на [homework] Вы сможете увидеть проблему, пройдя по коду в отладчике, но у вас есть одна проблема: значение, возвращаемое isPalindrome, игнорируется.

Другая проблема, с которой вы столкнулись, заключается в том, что 0 в первой половине числа игнорируется. Это потому, что вы конвертируете строку в int и обратно в строку, так что 1020321 может показаться палиндромом.

Кстати: этот вопрос задавался много раз раньше. Вы сравнивали свой ответ с другими в Интернете?

0 голосов
/ 17 января 2012

Вы хотите s.Length()-2, а не s.Length()-1

Также вы можете изменить свой первый true тест на <= 1 и удалить специальный случай length == 2.

...