Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Инкремент в рекурсии

12.08.2012, 00:08. Показов 2550. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, что-то не могу врубиться.
Задача: используя рекурсию выводить введенный ранее текст в обратном порядке.

Вот рабочая версия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
void reverse(char *);
 
    char a[256];
    cout << "Enter the string: ";
    cin >> a;
    reverse(a);
 
    system("pause");
 
void reverse(char *str) {
    if (*str) {
        reverse(str + 1); //!!!
    }
    else
        return;
    cout << *str;
}
Пытался заменить
C++
1
reverse(str + 1);
на
C++
1
reverse(++str);
- но таким образом происходит потеря первого знака при выводе. Т.е. если я введу изначально "12345", то получу в ответ: " 5432". Почему так происходит?

Также заменял вышеупомянутую строчку на
C++
1
reverse(str++);
- но таким образом смещение по строке вообще не происходит и в итоге получаю переполнение цикла... Тоже не особо понимаю почему. Но вероятно из-за того, что в функцию передается сразу str, а ++ игнорируется. И так в бесконечный цикл и впоследствии stack overflow.
Но почему не срабатывает тогда
C++
1
reverse(++str);
? Ведь это аналогично
C++
1
reverse(str + 1);
... Или нет?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2012, 00:08
Ответы с готовыми решениями:

Инкремент переменной в рекурсии
Здравствуйте форумчане, что то не приходит идея как сделать в рекурсивном методе переменную, чтобы на следующем входе в функцию она не...

Инкремент
Приветствую! Потребовалось реализовать функцию инкремента, но ничего не выходит. Сабж: (define z 3) (define (++ x) (define...

Инкремент ++
3) Инкремент ромба (++): меньшая из диагоналей ромба увеличивается на единицу. В программировании новичок, не понимаю как вызвать...

6
 Аватар для Plusic
1 / 1 / 0
Регистрация: 26.07.2012
Сообщений: 26
12.08.2012, 00:19
пусть на входе у тебя str = 0

C++
1
2
3
4
5
6
    if (*str) {
        reverse(str + 1); //!!!
    }
    else
        return; 
    cout << *str;
// str - указывает на первый символ, все нормально

но

C++
1
2
3
4
5
6
if (*str) {
        reverse(++str); //!!!
    }
    else
        return; 
    cout << *str;
// str - уже указывает на 2 символ, вот и проблема , что пропал символ[/CPP]

а в другом когда (str++) случае он у тебя как на входе был 0 так и бесконечно передается как 0, т.к i++ вычисляется после оценки и вычисления выражения.
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 00:20
Цитата Сообщение от The_Immortal Посмотреть сообщение
Но вероятно из-за того, что в функцию передается сразу str, а ++ игнорируется.
Дело в том, что у каждого рекурсивного вызова своя str. Увеличение её на единицу в одном вызове не влияет на значение в другом. А так да, это суть постинкремента: в новый вызов reverse передаётся старое, неизменённое значение str, потому и всё падает с переполнением стека.

Цитата Сообщение от The_Immortal Посмотреть сообщение
Ведь это аналогично
C++
1
reverse(str + 1);
... Или нет?
Нет, это аналогично str = str + 1; reverse(str);
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 03:17  [ТС]
С постфиксным вариантом разобрался, а вот префиксный все равно не могу понять почему не срабатывает...(
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
12.08.2012, 04:21
ну если так сильно необходимо именно префикс инкремент, то перепиши так
C
1
2
3
4
5
6
7
8
9
void foo( char* p ) {
 
    char x = *p;
 
    if ( *p )
        foo( ++p );
 
    putchar( x );
}
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 09:59
Цитата Сообщение от The_Immortal Посмотреть сообщение
С постфиксным вариантом разобрался, а вот префиксный все равно не могу понять почему не срабатывает...(
Вот два варианта: с плюсом и с раскрытым инкрементом. Внимание на значение str в седьмой строке и в восемнадцатой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void reverse(char *str) {
    if (*str) {
        reverse(str + 1);
    }
    else
        return;
    cout << *str;
}
 
void reverse(char *str) {
    if (*str) {
//      reverse(++str);
        str = str + 1;
        reverse(str);
    }
    else
        return;
    cout << *str;
}
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 16:50  [ТС]
~OhMyGodSoLong~, так значит
C++
1
    reverse(str = str + 1);
тоже будет на две строки распадаться:
C++
1
2
str = str + 1;
reverse(str);
?

Странно... Я почему-то думал, что эта операция останется в пределах аргумента функции, а она выносится вне... =/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2012, 16:50
Помогаю со студенческими работами здесь

Инкремент
Можно каким то образом вставить инкремент в пост переменную? Например $_POST;

Инкремент и декремент
Друзья, подскажите пожалуйста, как результатом работы примера получаем число 45? Вот пример: $i = 10; $i += ++$i + $i + $i++; ...

Инкремент и декремент
int x = 100,a; a = x++/x--; System.out.println(&quot;от результ:&quot; + a); Результат получается 0 Знатоки, пожалуйста...

Простой инкремент
Добрый день! Начал изучать Haskell и столкнулся с проблемой. Как сделать функцию, которая взависимости от кол-ва параметров будет выполнять...

Инкремент/декремент
День добрый , подскажите пожалуйста как в VB делать инкремент или декримент, при помощи кнопки в программе изменять значение числа , от 0...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru