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

Нужно перевернуть строчку через рекурсию - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
AFI4ever
Сообщений: n/a
26.05.2011, 20:51     Нужно перевернуть строчку через рекурсию #1
Всем привет. Нужна помощь. Есть строчка и ее надо перевернуть, используя рекурсию. Всем, кто хотя бы натолкнет на идею спасибо, а то рекурсию вобще не шарю.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2011, 20:51     Нужно перевернуть строчку через рекурсию
Посмотрите здесь:

Число из 10-ой в 2-ю ,через рекурсию. C++
НОД через рекурсию C++
Факториал через рекурсию C++
C++ Нужно подробно закомментировать каждую строчку)
последовательность через рекурсию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igorrr37
 Аватар для igorrr37
1594 / 1222 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
26.05.2011, 21:41     Нужно перевернуть строчку через рекурсию #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
 
char* str="Distributed under the Software License, Version 1.0.", res[256];
 
void Rec(int ini, int fin){
    res[fin]=str[ini];
    if(fin-ini>1) Rec(ini+1, fin-1);
    res[ini]=str[fin];
}
 
int main(){
    Rec(0, strlen(str)-1);
    puts(res);
    return 0;
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
27.05.2011, 00:31     Нужно перевернуть строчку через рекурсию #3
Лучше вот так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
char *Reverse(char *begin, char *end = NULL) {
  if (end == NULL) {
    for (end = begin; *end != '\0'; ++end);
    return Reverse(begin, end - 1);
  }
  if (begin == end || begin > end) return begin;
  char c = *begin;
  *begin = *end;
  *end = c;
  Reverse(begin + 1, end - 1);
  return begin;
};
 
int main(int argc,char *argv[]) {
  char str[] = "This is a string.";
  std::cout << Reverse(str) << std::endl;
  return 0;
}
schdub
 Аватар для schdub
2903 / 1247 / 223
Регистрация: 19.01.2009
Сообщений: 3,219
Завершенные тесты: 1
27.05.2011, 15:40     Нужно перевернуть строчку через рекурсию #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну и еще рекурсия для маньяков:
C
1
2
3
4
5
6
7
main(x, Y)
{
    char q[]=".0.1 noisreV ,esneciL erawtfoS eht rednu detubirtsiD";
    int _=main, r;
    return x!=1?(Y>x?r=*(char*)x,*(char*)x=*(char*)Y,*(char*)Y=r,
    ((int(*)())_)(x+1,Y-1):666):(((int(*)())_)(q,q+strlen(q)-1),printf(q));
}
Вывод:
Код
D:\src\console\Debug>console
Distributed under the Software License, Version 1.0.
D:\src\console\Debug>
Компилировать компайлером совместимым с С89.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.05.2011, 15:43     Нужно перевернуть строчку через рекурсию #5
schdub, а можешь объяснить, как оно работает?
schdub
 Аватар для schdub
2903 / 1247 / 223
Регистрация: 19.01.2009
Сообщений: 3,219
Завершенные тесты: 1
27.05.2011, 16:01     Нужно перевернуть строчку через рекурсию #6
Цитата Сообщение от Nameless One Посмотреть сообщение
а можешь объяснить, как оно работает?
алгоритм, приблизительно такой же как и у lemegeton.
чтобы было понятнее операторы ?: заменил на ifы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
main (x, Y)
{
    int r; 
    char q[] = ".0.1 noisreV ,esneciL erawtfoS eht rednu detubirtsiD";
    if (x == 1)
    { 
        // БЛОК 1
        // после запуска попадаем сюда
        // т.к. argc (первый аргумент main()) == 1 ()
 
        // передаем управление БЛОКУ 2
        // 1-й параметр - указатель на первый символ строки
        // 2-й - указатель на последный символ
        main(q, q + strlen(q) - 1);
 
        // здесь строка уже будет модифицирована,
        // т.е. Distributed under the Software License, Version 1.0.
        printf(q);
    }
    else if (Y > x) // если указатель начала строки меньше указателя окончания
    {
        // БЛОК 2
        // 1-й параметр - указатель на первый символ строки
        // 2-й - указатель на последный символ
 
        // обыкновенный swap()
        r = *(char*)x;
        *(char*)x = *(char*)Y;
        *(char*)Y = r;
        // увеличиваем указатель на начало
        // и уменьшаем указатель на окончание
        // и передаем управление блоку 2
        main(x + 1, Y - 1);
    }
    return 0;
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.05.2011, 16:04     Нужно перевернуть строчку через рекурсию #7
Цитата Сообщение от schdub Посмотреть сообщение
C
1
int _=main, r;
А как эту строку понимать?
schdub
 Аватар для schdub
2903 / 1247 / 223
Регистрация: 19.01.2009
Сообщений: 3,219
Завершенные тесты: 1
27.05.2011, 16:13     Нужно перевернуть строчку через рекурсию #8
Цитата Сообщение от Nameless One Посмотреть сообщение
А как эту строку понимать?
в переменную с именем '_' берем указатель на функцию main, ну а затем main вызываем через этот указатель:
C
1
2
3
(((int(*)())_)(q,q+strlen(q)-1);
// или просто
main(q, q + strlen(q) - 1);
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.05.2011, 16:15     Нужно перевернуть строчку через рекурсию #9
schdub, спасибо, понял.

Не по теме:

сам такое придумал или нашел где?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2011, 16:16     Нужно перевернуть строчку через рекурсию
Еще ссылки по теме:

поиск через рекурсию C++
Нужно перевернуть стек C++
C++ Найти тангенс x через рекурсию

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

Или воспользуйтесь поиском по форуму:
schdub
 Аватар для schdub
2903 / 1247 / 223
Регистрация: 19.01.2009
Сообщений: 3,219
Завершенные тесты: 1
27.05.2011, 16:16     Нужно перевернуть строчку через рекурсию #10
Кстати, у нас на форуме была тема по разбору подобной программки, выводящей Hello world! из заксоренного массива - вот ссылка на мой пост о ее разборе http://www.cyberforum.ru/cpp-beginne...ml#post1091299

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
сам такое придумал или нашел где?
эта прога моя :-)

Yandex
Объявления
27.05.2011, 16:16     Нужно перевернуть строчку через рекурсию
Ответ Создать тему
Опции темы

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