Программа С++ для реверсирования строки с помощью рекурсии продолжает выдавать мне нежелательную букву, но аналог Python работает

Программа C++ (неправильно)

#include <iostream>
#include <string>

using namespace std;

char revstr(string s, int n){ //I cannot assign string here. Error pops up.
    if (n == 0){
        return s[0];
    }
    else
    {
        return s[n] + revstr(s, n-1);
    }
}

int main(){
    string sin;
    cin >> sin;
    int n = sin.length() - 1;
    cout << revstr(sin, n) << endl;
    return 0; 
}

Программа Python (правильно)

def revstr(s, n):
    if n == 0:
        return l[0]
    else:
        return l[n] + revstr(s, n-1)

#Main Code
sin = input()
l = []

for i in range(0, len(sin)):
    l.append(sin[i])

print(l)
n = len(l) - 1
print(revstr(sin, n))

Описание

Я пытаюсь перевернуть строку, используя метод рекурсии в качестве классной работы, но тогда моя программа работает на Python, но не на C++, что дает только «O».

Я не знаю, в чем проблема в программе на C++, так как аналог Python работает хорошо.

Например,

Вход

Computer

Вывод С++

O

Вывод Python

retupmoC

ВАЖНЫЙ

  1. В инструкциях сказано, что я должен сделать это в рекурсии
  2. Это происходит, когда я объявляю возвращаемое значение функции как строку.
error: could not convert 's.std::__cxx11::basic_string<char>::operator[](0)' from '__gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' {aka 'char'} to 'std::string' {aka 'std::__cxx11::basic_string<char>'}
    8 |         return s[0];
      |                   ^
      |                   |
      |                   __gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type {aka char}   

Вам нужно сделать это рекурсивно? Это только усложняет задачу, если вы спросите меня... в любом случае, на первый взгляд, условие n == 1 выглядит неправильно...

codeling 10.04.2022 16:57

Да, в инструкциях сказано, что я должен сделать это в рекурсии. Кстати, я изменил с n == 1 на 0, но проблема все еще существует

Interference 10.04.2022 16:57

Вы возвращаете char, который является одним символом. Операция +, которую вы выполняете, суммирует значение ascii всех символов.

drescherjm 10.04.2022 17:00

Да, но почему-то я не могу сделать это с помощью строки. Если я объявляю функцию с помощью строки, появляется ошибка.

Interference 10.04.2022 17:00

@drescherjm Подождите, как? Я не понимаю, что говорит компилятор, но я получаю только местонахождение ошибки.

Interference 10.04.2022 17:03

Ваша функция возвращает char, но она должна возвращать строку.

Yves Daoust 10.04.2022 17:11

Вы можете использовать s.substr(x, 1) вместо s[x] и вернуть строку.

jabaa 10.04.2022 17:13

@Diffract Я не знаю, в чем проблема в программе на C++, так как аналог Python работает хорошо. — ваша первая ошибка — попытаться написать код на C++, используя Python в качестве модели. Вы не можете так «переводить» с одного языка на другой — сначала вы должны знать оба языка. Затем следующий шаг — выбросить версию Python и реализовать решение с использованием C++ используя идиомы C++, а не кода, подобного Python.

PaulMcKenzie 10.04.2022 17:37
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
10
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я вижу три проблемы с кодом:

  1. Проверьте тип возвращаемого значения revstr - вы хотите вернуть полную строку, но она возвращает один символ (в этом причина проблемы, которую вы видите, а именно в том, что программа записывает только один, часто странный символ; вы в настоящее время просто складываете символов, значения, конечно, переполняются, поскольку диапазон char обычно ограничен -128..127)
  2. Изменение вышеуказанного вызывает, как вы заметили в комментариях, последующую проблему - как преобразовать одиночный символ в строку, на что, к счастью, есть ответ уже здесь на SO
  3. Ваше условие выхода из рекурсии - это n == 1... как насчет строк длины 1? Они никогда не достигнут n == 1...

Чтобы сразу решить проблемы 2 и 3 и немного упростить код, подумайте о случае с пустой строкой и о том, может ли ваш код справиться с этим в данный момент. Вы можете справиться с этим случаем, просто вернув пустую строку...

Решено. Предложение 2 на самом деле проблема, которую я искал. Я могу изменить return s[0]; в строку r(1, s[0]); вернуть р;

Interference 10.04.2022 17:16

даже лучше, как я отмечаю под списком, попробуйте также правильно обработать пустую строку, тогда вам даже не нужно преобразование char в строку!

codeling 10.04.2022 17:17

О, я на самом деле тоже пытался, но выскочили забавные персонажи. Я сделал """return s[0] + "";""" для этой строки.

Interference 10.04.2022 17:20
if (n < 0) { return string(); } у меня отлично работает без "забавных персонажей" ;)
codeling 10.04.2022 17:22

О, тоже работало. Не могу в это поверить. Однако я понятия не имею, что такое string(). А можно это тоже описать? Я новичок.

Interference 10.04.2022 17:25

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

codeling 10.04.2022 17:27

Давайте продолжить обсуждение в чате.

Interference 10.04.2022 17:30

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