Программа С++ для реверсирования строки с помощью рекурсии продолжает выдавать мне нежелательную букву, но аналог 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
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
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

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