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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
#1

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

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

Инкремент в произведении - C++
Друзья, на ерунде запнулся, допустим: n = 2000; тогда в какой последовательности нужно решать вот это выражение: --n*n*n = ? ...

постфиксный инкремент - C++
class Inkrement { Inkrement(){}; Inkrement &amp;operator++(int) { Inkrement temp = *this; ++*this; return temp; ...

Не работает инкремент - C++
repeat: if(e&lt;=mode){ cout &lt;&lt; &quot;\nИгрок №&quot; &lt;&lt; e &lt;&lt; a &lt;&lt; endl; cin &gt;&gt; sim &gt;&gt; b;//записываем в строку для...

Инкремент переменной - C++
в задании сказано, что пользователь вводит строку и программа выводит ее, но если пользователь вводит еще и цифру, то программа должна...

Инкремент указателя - C++
#include &lt;iostream&gt; using namespace std; class Student { public: Student(){A=B=C=2;} int getA(){return A;} ...

Инкремент ссылки - C++
int arr = {....} ; while(arr) // arr ссылка на начало массива то есть на 0 элемент ; { //тело цикла ++arr ;//инкремент } ...

6
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++ вычисляется после оценки и вычисления выражения.
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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);
1
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
12.08.2012, 03:17  [ТС] #4
С постфиксным вариантом разобрался, а вот префиксный все равно не могу понять почему не срабатывает...(
0
alkagolik
Заблокирован
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 );
}
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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;
}
1
The_Immortal
1552 / 488 / 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);
?

Странно... Я почему-то думал, что эта операция останется в пределах аргумента функции, а она выносится вне... =/
0
12.08.2012, 16:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2012, 16:50
Привет! Вот еще темы с ответами:

Инкремент(Декремент) - C++
Есть ли разница,какую употреблять форму:префиксную или постфиксную? Если на экран выводится одно и то же число в префиксной и постфиксной...

Инкремент и преинкремент - C++
Здравствуйте. Я вот решил протестить в чем разница между инкрементом и преинкрементом, и как-то не увидел разницы... В чем же разница? :) ...

Инкремент и передача параметров - C++
Недавно наткнулся на человека, который утверждал что: int add(int x, y) { return x+y; } int func() { int i = 1; return...

Почему не срабатывает инкремент? - C++
В комментарии показал вывод программы. Все переменные почему равны 2 Получается инкремент не оказывает никакого влияния? int a=0,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru