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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
AFI4ever
Сообщений: n/a
#1

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

26.05.2011, 20:51. Просмотров 1975. Ответов 9
Метки нет (Все метки)

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

Нужно перевернуть стек - C++
нужно доделать, никак не могу сообразить. нужно просто перевернуть стек, касе 6. помогите пожалуйста #include<iostream> using...

поиск через рекурсию - C++
С помощью массива структур описать каталог компьютерных игр, предусмотрев следующие характеристики: название, производитель, год издания,...

последовательность через рекурсию - C++
нужна ваша помощь задача такая: написать рекурсивную функцию для ввода последовательности чисел и вывода ее на экран в обратном...

Число из 10-ой в 2-ю ,через рекурсию. - C++
Доброго дня. Требуется написать программу (из 2-ой в 10-ю) .С использованием рекурсии. Выход данной программы 0. Что следует поправить? ...

Факториал через рекурсию - C++
Подскажите, как можно вычислить факториал некоторого числа через рекурсию функций (через цикл либо другим методом не интересует). Есть...

НОД через рекурсию - C++
Нужно написать программу для нахождения НОД через рекурсию по такому алгоритму: 1) задать два числа; 2) если числа равны, то взять...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
igorrr37
1646 / 1274 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,383
Завершенные тесты: 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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.05.2011, 15:43 #5
schdub, а можешь объяснить, как оно работает?
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,383
Завершенные тесты: 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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.05.2011, 16:04 #7
Цитата Сообщение от schdub Посмотреть сообщение
C
1
int _=main, r;
А как эту строку понимать?
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,383
Завершенные тесты: 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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.05.2011, 16:15 #9
schdub, спасибо, понял.

Не по теме:

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

schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,383
Завершенные тесты: 1
27.05.2011, 16:16 #10
Кстати, у нас на форуме была тема по разбору подобной программки, выводящей Hello world! из заксоренного массива - вот ссылка на мой пост о ее разборе http://www.cyberforum.ru/cpp-beginne...ml#post1091299

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2011, 16:16
Привет! Вот еще темы с ответами:

Нужно подробно закомментировать каждую строчку) - C++
int a = {3, 5, 7, 1, 2, 3, 4, 5}; const int n = 8; cout&lt;&lt;&quot;Massiv: &quot;&lt;&lt;endl; for(int i = 0; i != n; ++i) cout&lt;&lt;a; int tmp...

Найти тангенс x через рекурсию - C++
/*Вычисление тангенса задано формулой Найти тангенс(к примеру,пи/3, n=4) tg(x) = ---------x----------- x^2 ...

Имитация цикла for через рекурсию - C++
Имитация цикла for через рекурсию

Не высчитывает корень через рекурсию - C++
double kor(double a) { double Xn=0.5*(1+a); if (fabs(Xn-a)&gt;0.0001) return a; else return Xn=0.5*(kor(a-1)+a/kor(a-1)); } void...


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

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

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