2017-01-18 10 views
-2

Я хочу найти Palindrome слова. Что здесь не так?Найти Palindrome

Основная функция:

int size; 
    string input; 
    cin>>input; 
    size = input.length(); 
    if(testPalindrome(input,size-1,0)) 
    cout<<"It's Palindrome"; 
    else 
    cout<<"It's not Palindrome"; 

И функция testPalindrome является:

bool testPalindrome (string pal , int last, int first){ 

    if (pal[first] != pal[last]) 
     return false; 
    else{ 
     if (first<last) 
      testPalindrome(pal,last-1,first+1); 
     else 
      return true; 
    } 
} 

Я прочитал this link и нашел ответ для определения палиндромов, но почему это один не работает?

+4

Похоже, вам, возможно, потребуется научиться использовать отладчик для шага t через ваш код. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

В вашем 'testPalindrome'е есть пути, которые ничего не возвращает. Это приводит к * неопределенному поведению *. Хороший компилятор должен был кричать на вас за это. –

+2

Пожалуйста, будьте более конкретными, чем «не работает». Существует множество способов, которыми программа «не работает». – molbdnilo

ответ

2

Я думаю, что вы забыли оператор возврата в функции

if (first<last) 
     return testPalindrome(pal,last-1,first+1); 
     ^^^^^^^ 

Обычно первый параметр диапазона определяет более низкое значение, а второй параметр указует либо верхнее значение диапазона, которое не входят в диапазон или количество элементов в последовательности.

И первый параметр должен быть объявлен как имеющий постоянный ссылочный тип, потому что сама строка не изменяется, и вы избежите выделения дополнительной памяти.

Рекурсивный функция может быть записана как

#include <iostream> 
#include <string> 

bool testPalindrome(const std::string &s, 
    std::string::size_type i, 
    std::string::size_type n) 
{ 
    return n < 2 || (s[i] == s[n-1] && testPalindrome(s, i + 1, n - 2)); 
} 

int main() 
{ 
    std::cout << testPalindrome("abba", 0, 4) << std::endl; 
    std::cout << testPalindrome("aba", 0, 3) << std::endl; 
    std::cout << testPalindrome("aa", 0, 2) << std::endl; 
    std::cout << testPalindrome("a", 0, 1) << std::endl; 
    std::cout << testPalindrome("ab", 0, 2) << std::endl; 

    return 0; 
} 

Выход программы

1 
1 
1 
1 
0 

Самый простой способ проверить объект типа std::string является ли палиндром, чтобы записать выражение

s == std::string(s.rbegin(), s.rend()) 
6

Вам нужно вернуть результат рекурсивного вызова, как при вызове любой другой функции.

Если вы этого не сделаете, поведение не определено.