Я хочу, чтобы мой второй оператор if выполнял цикл рекурсивного типа, но он ничего не возвращает и по умолчанию принимает значение false. Что я делаю не так?

bool isPalindrome(string some_string) {
    if (some_string.length() == 0 || some_string.length() == 1) {
        return true;
    }

    if (some_string[0] == some_string[some_string.length() - 1]) {
        return isPalindrome(some_string.substr(1, some_string.length() - 1));
    }

    else {
        return false;
    }
}

Прежде всего, этот код проверяет, является ли строка палиндромом или нет. Я просмотрел несколько ссылок и подумал, что могу использовать substr для получения символов после первого индекса и перед последним индексом символов. Что я делаю не так? Я здесь впервые, поэтому прошу прощения, если этот вопрос был не совсем правильно задан.

Что такое отладчик и как он может помочь мне диагностировать проблемы? Ваш отладчик быстро покажет вам ошибку.
Drew Dormann 09.07.2024 20:14

Тактическое примечание: создание новых strings может оказаться очень дорогим. Лучше передать string по ссылке, а вместе с ней передать индексы начала и конца интересующей области.

user4581301 09.07.2024 20:14

Добавьте std::cout << some_string << '\n'; в начало вашей функции, и вы сможете увидеть, что такое some_string, и это должно точно сказать вам, в чем проблема.

ChrisMM 09.07.2024 20:16
substr занимает позицию и отсчитывает (длину), а не начальную и конечную позицию. Что это говорит вам о том, что вы должны передать в качестве второго аргумента?
j6t 09.07.2024 20:17

Примечание: some_string[0] == some_string[some_string.length() - 1] будет немного более читабельным, чем some_string.front() == some_string.back().

user4581301 09.07.2024 20:18

Примечание по использованию Stack Overflow: дайте «Как задавать» и «Написание идеального вопроса» для прочтения. Знать, что делает вопрос хорошим, гораздо эффективнее, чем не знать и извиняться.

user4581301 09.07.2024 20:21

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

sweenish 09.07.2024 21:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема вашего кода в том, что substr() используется неправильно. Вот ссылка на cppreference с полной документацией об этом методе. Но если говорить простыми словами, проблема в том, что второй аргумент этого метода — это не последний индекс подстроки, а количество символов, которые следует включить в подстроку. Итак, во втором if вы вызываете рекурсию с той же строкой, но без первой буквы. Итак, для строки "abba" будет выполняться isPalindrome("bba") вместо isPalindrome("bb").

Чтобы сделать то, что вы намеревались сделать, вам нужно изменить эту строку:

return isPalindrome(some_string.substr(1, some_string.length() - 1));

вместо этого:

return isPalindrome(some_string.substr(1, some_string.length() - 2));

Для потомков вот реализация с использованием итераторов. Чрезвычайно дешево для длинных струн и очень быстро. В качестве бонуса — всего пять строк кода:

#include <iostream>
#include <string>

bool isPalindrome(std::string::const_iterator begin, std::string::const_iterator end) noexcept;

int main()
{
    std::string abba{"amanaplanacanalpanama"};
    return isPalindrome(std::cbegin(abba), std::cend(abba));
}

bool isPalindrome(std::string::const_iterator begin, std::string::const_iterator end) noexcept {
    if (begin == end) return true;
    if (end < begin) return false;
    const auto b = *begin;
    const auto e = *(end - 1);
    return (b == e) ? ( begin != (end - 1) ? isPalindrome(++begin, --end) : true) : false;
}

Другие вопросы по теме