Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу разобраться с рекурсией, укладка плитки 
:(
    Опции темы
Jilian
Дата 15.2.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Коридор имеет размеры 3*N. Для любого заданного N, необходимо определить максимальное количество различных вариантов, которыми можно уложить паркет в этом коридоре плитками размером [1*2] или [2*2] (сами варианты укладки паркета определять не надо).
Например для N=2, ответом будет 5.

Это сообщение отредактировал(а) Jilian - 15.2.2006, 20:53
PM MAIL   Вверх
cardinal
Дата 15.2.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Jilian
Дата 15.2.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А зачем мне числа Фибоначчи? О них и Вирте почитать можно -)
PM MAIL   Вверх
SoWa
Дата 15.2.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

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



Не понял?
там числа фибоначи и рекурсия. А тут ищем кол-во.
Составить ф-ю и максимизировать её. Только вот с функцией проблемма.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Jilian
Дата 15.2.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так ведь и ёжику понятно, что функцию надо составить. Только вот я никак не могу её составить. Ясно, что функция рекурсивная, но не все что рекурсия, есть числа Фибоначчи, с таким же успехом Вы могли дать мне ссылку на Ханойские башни.
Нет, в данной задачи Фибоначчи не поможет -)
PM MAIL   Вверх
esperant0
Дата 15.2.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решим сначала задачу.

Нужно замостить 1*х метров с помощью досок длиной 1*2 и 1*8

Решается с помощью динамического программирования.


Обозначим черех Ф(Х) количество способов замостить доску размером 1*х


очевидно, что
Ф(х)=Ф(х-2)+Ф(х-8)

Ф(1)=0
Ф(2)=1
Ф(3)=0
...
Ф(8)=2

вот уравнение решая которое находим ответ.


Ваша задача решаеться аналогичной техникой. Подумайте как



--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
cardinal
Дата 15.2.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Ты сказал "не могу разобраться с рекурсией" вот я тебе и дал ссылку. Видимо с рекурсией проблем у тебя нет. Так может в след. раз ты поумнее название темы придумаешь? smile

А так мысли такие:
Код

if((N<=1) || (N%2))
   return 0;
else if (N==2)
   return 5;
else
   return pow(5,N/2) + pow(2,N/2);

Вроде даже без рекурсии...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 15.2.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



А хотя нет, над правой стороной
Код

 + pow(2,N/2);

надо еще подумать...
Может так:
Код

int i=1;
int x=5;
if((N<=1) || (N%2))
   return 0;
else if (N==2)
   return 5;
else
{
   for(i=1; i<N/2-1; i++)
      x*=(x+2);
   return pow(5,N/2) + x;
}

Я все не могу посчитать в ручную сколько же комбинаций для N = 6... smile

Но еще думаю, что тут можно все таки без рекурсии...
Добавлено @ 23:08
А может и нельзя... Я в полной прострации... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 15.2.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Во, еще мысля… Первые три числа для N=2,4,6 это помоему 5, 30, 139… Думаю, что можно теперь рекурсивно искать результат и для N=8 будет что-нибудь типа
результат = результат(6)+результат(2)…

Интересно это имел в виду esperant0. Лично ему дам плюс если просветит меня в
Цитата(esperant0 @ 15.2.2006, 19:47 Найти цитируемый пост)
динамического программирования.

smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



во-первых, нужно свести ситуацию на n-м шаге к ситуации на n-1
раскладывать плитку будем по столбикам (3 ячейки)
будем считать, что все кроме последнего столбика полностью покрыты
а то, что творится в последнем, бывает 8-ми видов (каждая ячейка может быть покрыта или нет)
рисовать все 8 ситуаций тут не буду - условимся, что номер ситуации в двоичное представлении имеет 1 там, где ячейка покрыта, и 0 там, где - нет
0 соответствует полностью непокрытому столбику
7 - полностью покрытому
1 - в котором одна крайняя ячейка покрыта и все
2 - центральная
и т.д.
теперь введем функцию - f(n,m) - количество способов разложить плитку так, чтобы n-1 столбик был покрыт полностью, а код ситуации в n-м столбике был m
таким образом стоит задача найти f(N,7)
выразим f(n,m) через ее значения на n-1 м шаге:
f(n,0)=f(n-1,7)
f(n,1)=f(n-1,6)
f(n,2)=f(n-1,5)
f(n,3)=f(n-1,7)+f(n-1,4)+f(n-1,4)
f(n,4)=f(n,1) //из-за симметрии
f(n,5)=f(n-1,2)
f(n,6)=f(n,3) //из-за симметрии
f(n,7)=3*f(n-1,0)+2*f(n-1,3)

удобнее рассмотреть соотношения этой функции не между соседними шагами, а между шагами через один - оно и понятно, на нечетных N у нас ответ и так 0
если все это дело подставить и упростить, получатся такие соотношения:

f(n,7)=5*f(n-2,7)+4*f(n-2,1)
f(n,1)=1*f(n-2,7)+2*f(n-2,1)

которые и представляют решение задачи...
Добавлено @ 02:01
теперь о том, как убрать рекурсию и соптимизировать (а другой причины убирать рекурсию тут и нету)
в том виде, в котором сейчас записано решение, количество вычислений будет расти экспоненциально при увеличении n
это почти всегда неприемлимо (исключение составляют учебные задачи, да и то не все smile)
первая оптимизация - динамическое программирование
в данном контексте (да и во многих других) оно может быть описано так "не нужно по нескольку раз пересчитывать одни и те же значения"
в нашем случае пересчет получается потому, что например f(n-2,7) нужно вычислять и при вычислении f(n,7), и при вычислении f(n,1)
это - нехорошо, лучше завести переменную, вычислить один раз f(n-2,7) и записать его туда
выразить это можно, например, с помощью умножения матрицы на вектор:
Код

(цикл n/2 раз)
{
  atemp=5*a+4*b;
  btemp=1*a+2*b;
  a=atemp;
  b=btemp;
}

тут все хорошо видно - 4 операции (неважно каких) на шаг от n-2 до n
общее количество таких операций растет линейно с увеличением n
такая скорость роста вполне приемлима в большинстве задач...


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 16.2.2006, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



maxim1000, а для n=6 можно увидеть развертку рекурсии? (если честно я пока ничего не понял smile)


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



но это не означает, что дальше оптимизировать некуда smile
динамическое программирование - довольно общий метод, а у нас специфическая ситуация - на каждом шаге мы производим не просто операции, а линейные операции
если переписать все это в виде матричной арифметики, то получим:
x(n)=A*x(n-2)
где:
x(n)=стобец( f(n,7), f(n,1) )
A - матрица:
(5 4)
(1 2)
так что можно заменить это на
x(n)=A(n)*x(0)
здесь A(n) - A в n-ой степени
вся суть оптимизации состоит в том, что для вычисления n-ой степени матрицы достаточно не n операций, а log n...
делается это, как обычно рассказывают для вычисления целой степени числа:
если n четное - A(n)=sqr(A(n/2))
иначе - A(n)=A*sqr(A((n-1)/2))
ну и A(1)=A
на каждом шаге n уменьшается в 2 раза, количество операций - логарифмическое...

где-то тут я описывал подобные манипуляции с вычислением чисел Фибоначчи...
Добавлено @ 02:16
Цитата(cardinal @ 16.2.2006, 01:08 Найти цитируемый пост)
maxim1000, а для n=6 можно увидеть развертку рекурсии?

забыл начальные значения:
f(2,7)=5
f(2,1)=1
тогда получаем:
f(4,7)=5*5+4*1=29
f(4,1)=1*5+2*1=7

f(6,7)=5*29+4*7=173
f(6,1)=1*29+2*7=43

кстати, то, что оно не совпадает с
Цитата(cardinal @ 15.2.2006, 22:23 Найти цитируемый пост)
5, 30, 139

наводит на мысль, что там могла быть ошибка
если это так - она, скорее всего, в уравнениях, которые связывают n-1-й и n-й шаги
с несколько меньшей вероятностью - в процессе подстановки и упрощения выражений при сведении к связи n-2-го b n-го шагов...

в самом принципе, как мне кажется, ошибки нет - там все достаточно просто...


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 16.2.2006, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если говорить о матричной арифметике, то для больших n, асимптотически верное решение проще получить найдя предварительно наибольшее собстеввное число матрицы, ведь возводить его в степень п, куда удобней чем саму матрицу. И на лицо ассимптотика роста


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

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


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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



Цитата(maxim1000 @ 16.2.2006, 00:10 Найти цитируемый пост)
наводит на мысль, что там могла быть ошибка

там это где? Я вручную пытался посчитать...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 16.2.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(cardinal @ 16.2.2006, 15:22 Найти цитируемый пост)
там это где? Я вручную пытался посчитать...


Цитата(maxim1000 @ 16.2.2006, 00:50 Найти цитируемый пост)
выразим f(n,m) через ее значения на n-1 м шаге:
f(n,0)=f(n-1,7)
f(n,1)=f(n-1,6)
f(n,2)=f(n-1,5)
f(n,3)=f(n-1,7)+f(n-1,4)+f(n-1,4)
f(n,4)=f(n,1) //из-за симметрии
f(n,5)=f(n-1,2)
f(n,6)=f(n,3) //из-за симметрии
f(n,7)=3*f(n-1,0)+2*f(n-1,3)




--------------------
qqq
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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