Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> методы построения Рекурсии 
:(
    Опции темы
ShadowC
Дата 13.9.2011, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



собственно,наверное вопрос крайне тупой,но все же,как научится строить рекурсивные алгоритмы,если нет методов,то может быть сможете дать какие нибудь ценные советы,наблюдения там,вообще буду благодарен любой помощи в этой проблеме
PM MAIL   Вверх
newbee
Дата 13.9.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



SICP. Книга такая, рекурсии учит, правда не на С++, но это не важно при изучении рекурсии.


--------------------
You're face to face
With man who sold the world
PM   Вверх
IlyaIvanov
Дата 13.9.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.9.2011
Где: Новосибирск

Репутация: нет
Всего: нет



Ну здесь все просто. Как в песне Максима Леонидова "Я оглянулся посмотреть не оглянулась ли она чтоб посмотреть не оглянулся ли я" smile
Рекурсия это функция, которая запускает сама себя.
Вот пример :
Вам нужно посчитать n!=1*2*...*n. 
Итеративно Вы это делали так
Код

long int f=1;
for (int i=1; i<=n; i++)
f*=i;


Теперь напишем рекурсивно то же самое :
Код

long int f (long int i)
{
if (i==1)
return 1;
return i*f(i-1);
}


Получается что функция которая получила значение 5 возвратит 5* и вызовет сама себя с 4-кой, которая в свою очередь вернет 4* и запустит опять же сама себя с 3-кой. Закончатся рекурсивные запуски, когда параметр будет = 1. Итого получим 5*4*3*2*1. Тот же самый факториал.
PM MAIL WWW ICQ Skype   Вверх
shara
Дата 14.9.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: 2
Всего: 2



 smile  (простити не удержался) 


Чтобы понять рекурсию, нужно понять рекурсию...  smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
borisbn
Дата 14.9.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Исчо один  smile 
(навеяно предыдущим)
http://goo.gl/Hjkk6



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ShadowC
Дата 14.9.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



пля ребят вы прям копетаны,что бы понять рекурсию надо понять рекурсию,хорошо приведу более конкретный пример,если мне надо составить древо рекурсии для ханойской башни,мне что 4 часа сидеть и веточки рисовать просчитывая все возможные варианты?
PM MAIL   Вверх
502
Дата 14.9.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Я всегда прав
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 16.7.2011

Репутация: нет
Всего: 4



Цитата(ShadowC @  14.9.2011,  11:39 Найти цитируемый пост)
пля ребят вы прям копетаны,что бы понять рекурсию надо понять рекурсию,хорошо приведу более конкретный пример,если мне надо составить древо рекурсии для ханойской башни,мне что 4 часа сидеть и веточки рисовать просчитывая все возможные варианты? 

а ты что хотел, 5 мин и готово?
PM MAIL   Вверх
ShadowC
Дата 14.9.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



Цитата(502 @ 14.9.2011,  11:59)
Цитата(ShadowC @  14.9.2011,  11:39 Найти цитируемый пост)
пля ребят вы прям копетаны,что бы понять рекурсию надо понять рекурсию,хорошо приведу более конкретный пример,если мне надо составить древо рекурсии для ханойской башни,мне что 4 часа сидеть и веточки рисовать просчитывая все возможные варианты? 

а ты что хотел, 5 мин и готово?

ну не 5 минут,но мне кажется это диким,вот так создавать рекурсивные алгоритмы
PM MAIL   Вверх
RastaDja
Дата 14.9.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 3
Всего: 5



вот алгоритм:
   1. Создать функцию foo(Type par)
   2. Внутри функции проверить какой-нибудь алгоритм над параметром par (таких параметров может быть несколько).
   3. Если нашел решение, прекращаешь рекурсию(рекурсия прекращается если ты больше не вызываешь функцию еще раз), если не нашел, вызываешь функцию внутри себя.
   
Код

void foo(int a)
{
    if( a > 0 )
    {
        cout >> a;
        foo( a - 1 );
    }
    else
    {
        //  прекращается рекурсия, кода нету
    }
}



--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
newbee
Дата 14.9.2011, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



Цитата(ShadowC @  14.9.2011,  12:39 Найти цитируемый пост)
пля ребят вы прям копетаны,что бы понять рекурсию надо понять рекурсию,хорошо приведу более конкретный пример,если мне надо составить древо рекурсии для ханойской башни,мне что 4 часа сидеть и веточки рисовать просчитывая все возможные варианты? 
Какие все возможные варианты? Ты зачем ханойскую башню брутфорсишь, там алгоритм простой, можно и итерационно решить. И не надо про копетанов, я тебе годную литературу посоветовала.


--------------------
You're face to face
With man who sold the world
PM   Вверх
RastaDja
Дата 14.9.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 3
Всего: 5



а еще, можешь создать рекурсию с помощью нескольких функций, которые вызывают друг друга внутри себя
Код

int foo1(int par)
{
   int tmp = par * rand();
   if(tmp > 10 && tmp < 100) 
   {
      return foo2(tmp );   //  другая рекурсивная функция
   }
   else
   {
      return foo1();   // рекурсия
   }
}

int foo2(int par)
{
    if( par > 0 )
    {
        return foo2(par - 1)
    }
    else
    {
        return 0;
    }
}


так же внутри foo2() можешь вызвать foo1() и т.д.

Это сообщение отредактировал(а) RastaDja - 14.9.2011, 13:28


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
ShadowC
Дата 14.9.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



Цитата(newbee @ 14.9.2011,  13:22)
Цитата(ShadowC @  14.9.2011,  12:39 Найти цитируемый пост)
пля ребят вы прям копетаны,что бы понять рекурсию надо понять рекурсию,хорошо приведу более конкретный пример,если мне надо составить древо рекурсии для ханойской башни,мне что 4 часа сидеть и веточки рисовать просчитывая все возможные варианты? 
Какие все возможные варианты? Ты зачем ханойскую башню брутфорсишь, там алгоритм простой, можно и итерационно решить. И не надо про копетанов, я тебе годную литературу посоветовала.

да не про тебя речь,речь про тех кто влез со своими  smile ,тем кто посоветовал что-то дельное огромное спасибо и ты в их числе
PM MAIL   Вверх
xvr
Дата 14.9.2011, 16:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(ShadowC @  13.9.2011,  15:30 Найти цитируемый пост)
может быть сможете дать какие нибудь ценные советы,

Самое главное в рекурсии - не забыть из нее выйти  smile 
Я как то смотрел, как один перец писал рекурсивное вычисление факториала (писал он на Pascal'е, но я буду на С)
Первый вариант был таким:
Код

int fact(int v)
{
 return v*fact(v-1);
}
после чего он обвинил компилятор в багах ОС в ущербности - не смогла понимаешь стек выделить побольше  smile 
Когда ему намекнули, что в рекурсии должна быть как минимум проверка на ее окончание, он родил 2й вариант:
Код

int fact(int v)
{
 int rv=v*fact(v-1);
 if (v==0) return 1;
 return rv;
}
результат - 2й круг обвинений  smile 
В общем 3й вариант заработал, но это уже было не интересно  smile 

PM MAIL   Вверх
ShadowC
Дата 14.9.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 23.6.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 14.9.2011,  16:24)
Цитата(ShadowC @  13.9.2011,  15:30 Найти цитируемый пост)
может быть сможете дать какие нибудь ценные советы,

Самое главное в рекурсии - не забыть из нее выйти  smile 
Я как то смотрел, как один перец писал рекурсивное вычисление факториала (писал он на Pascal'е, но я буду на С)
Первый вариант был таким:
Код

int fact(int v)
{
 return v*fact(v-1);
}
после чего он обвинил компилятор в багах ОС в ущербности - не смогла понимаешь стек выделить побольше  smile 
Когда ему намекнули, что в рекурсии должна быть как минимум проверка на ее окончание, он родил 2й вариант:
Код

int fact(int v)
{
 int rv=v*fact(v-1);
 if (v==0) return 1;
 return rv;
}
результат - 2й круг обвинений  smile 
В общем 3й вариант заработал, но это уже было не интересно  smile

это было бы смешно,если бы не было так грустно,вся ирония а том,что возможно когда-нибудь к тебе попадет код этого человека и именно тебе придется его отлаживать и исправлять,ну может быть не этого,но таких грамотеев поверь немало
PM MAIL   Вверх
mes
Дата 14.9.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



 smile 
Цитата(IlyaIvanov @  13.9.2011,  16:59 Найти цитируемый пост)
Код

long int f=1;
for (int i=1; i<=n; i++)
f*=i;



Цитата(IlyaIvanov @  13.9.2011,  16:59 Найти цитируемый пост)

Код

long int f (long int i)
{
if (i==1)
return 1;
return i*f(i-1);
}


ну уж три строчки неужто так трудно было привести в порядок.. представляю как выглядит более массивные участки кода.. "повезло" ж тем, кому это придется читать.. 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.