рекурсия функции палиндрома

кто-нибудь поможет мне понять, что не так с моей функцией 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;
}

person feng63600    schedule 17.01.2012    source источник
comment
Обычно мы не делаем вашу домашнюю работу за вас.   -  person Daniel Lidström    schedule 17.01.2012
comment
У вас также будут проблемы, если в вашем int есть 0. Преобразуйте int в String, а затем используйте метод isPalindrome, который работает только со строками и больше не преобразуется в int.   -  person JB Nizet    schedule 17.01.2012
comment
Лучше всего сказать, в чем проблема Some.   -  person weston    schedule 17.01.2012
comment
Ваш вопрос почти дубликат. Проверьте это сообщение о переполнении стека, напишите свой код.   -  person ring bearer    schedule 17.01.2012


Ответы (4)


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

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

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

     if(s.charAt(0) == s.charAt(s.length()-1)) {
         s = s.substring(1, s.length()-2);
         return isPalindrome(Integer.parseInt(s));
     } else {
       false;
     }
person Shraddha    schedule 17.01.2012

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

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

person amit    schedule 17.01.2012
comment
@ feng63600: Добро пожаловать. Не забудьте принять ответ, который помог вам больше всего. - person amit; 17.01.2012

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

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

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

person Peter Lawrey    schedule 17.01.2012

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

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

person Ian Horwill    schedule 17.01.2012
comment
Это не правильно. использование length()-2 создаст строку, которая заканчивается слишком рано. подумайте, что он будет делать на входе "aaa". [подсказка: "aaa".substring(1,"aaa".length()-2) приводит к пустой строке] - person amit; 17.01.2012
comment
Извините - думал в .NET, где подстрока принимает начальный индекс и длину! - person Ian Horwill; 17.01.2012