Форум программистов, компьютерный форум CyberForum.ru

Инкремент в рекурсии - C++

Восстановить пароль Регистрация
 
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 00:08     Инкремент в рекурсии #1
Ребят, что-то не могу врубиться.
Задача: используя рекурсию выводить введенный ранее текст в обратном порядке.

Вот рабочая версия:
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);
... Или нет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 00:08     Инкремент в рекурсии
Посмотрите здесь:

Инкремент(Декремент) C++
C++ Инкремент указателя
Инкремент ссылки C++
Инкремент и преинкремент C++
C++ Инкремент переменной
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Plusic
 Аватар для Plusic
1 / 1 / 0
Регистрация: 26.07.2012
Сообщений: 26
12.08.2012, 00:19     Инкремент в рекурсии #2
пусть на входе у тебя 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++ вычисляется после оценки и вычисления выражения.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 00:20     Инкремент в рекурсии #3
Цитата Сообщение от The_Immortal Посмотреть сообщение
Но вероятно из-за того, что в функцию передается сразу str, а ++ игнорируется.
Дело в том, что у каждого рекурсивного вызова своя str. Увеличение её на единицу в одном вызове не влияет на значение в другом. А так да, это суть постинкремента: в новый вызов reverse передаётся старое, неизменённое значение str, потому и всё падает с переполнением стека.

Цитата Сообщение от The_Immortal Посмотреть сообщение
Ведь это аналогично
C++
1
reverse(str + 1);
... Или нет?
Нет, это аналогично str = str + 1; reverse(str);
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 03:17  [ТС]     Инкремент в рекурсии #4
С постфиксным вариантом разобрался, а вот префиксный все равно не могу понять почему не срабатывает...(
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
12.08.2012, 04:21     Инкремент в рекурсии #5
ну если так сильно необходимо именно префикс инкремент, то перепиши так
C
1
2
3
4
5
6
7
8
9
void foo( char* p ) {
 
    char x = *p;
 
    if ( *p )
        foo( ++p );
 
    putchar( x );
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.08.2012, 09:59     Инкремент в рекурсии #6
Цитата Сообщение от 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 16:50     Инкремент в рекурсии
Еще ссылки по теме:

C++ Не работает инкремент
C++ постфиксный инкремент

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

Или воспользуйтесь поиском по форуму:
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 16:50  [ТС]     Инкремент в рекурсии #7
~OhMyGodSoLong~, так значит
C++
1
    reverse(str = str + 1);
тоже будет на две строки распадаться:
C++
1
2
str = str + 1;
reverse(str);
?

Странно... Я почему-то думал, что эта операция останется в пределах аргумента функции, а она выносится вне... =/
Yandex
Объявления
12.08.2012, 16:50     Инкремент в рекурсии
Ответ Создать тему
Опции темы

Текущее время: 02:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru