Не только слово XTREE , все слова с нечетным количеством букв подходят для "ёлочной" рекурсии. Все буквы слова расположены в форме ёлки.
Для слова XTREE получается след. ёлка :
Представьте себе, что вы уполномоченный по безопасности пожарной службы. Сколько возможных путей пожара до верхушки, если одна буква на самом нижнем уровне зажигается через одну свечку и огонь может распростроняться тольк вверх и вправо-вверх (в левой половине дерева) и соответсвенно влево-вверх (в правой половине дерева).
Ответьте на вопрос рекурсивным математическим определением функции XFire и реализуйте в паскале.
Помогите, пожалуйста, разобраться. Не понимаю вообще как решать задачу. В какую сторону идти?
andriano
4.01.2010 14:13
Для начала почитать что-нибудь про рекурсию. Этого достаточно.
lopata
4.01.2010 15:29
Для начала я почитала. И тем не менне непонятно... Я понимаю, что это моя проблема в непонимании. Но прошу помочь как-нибудь..
andriano
4.01.2010 16:07
И чего ты хочешь? Чтобы тебе пересказали то же самое, но своими словами?
lopata
4.01.2010 16:15
Я не знаю. Просто объяснить как рекурсия работает на этом примере.
volvo
4.01.2010 16:46
Цитата
Просто объяснить как рекурсия работает на этом примере.
Почему именно на этом? Тебе уже объясняли, как работает рекурсия, неоднкратно. Ты говоришь, что читала, но не поняла. Какой смысл здесь "растекаться мыслью по древу" (С)? Если ты не поняла там - какой шанс у тебя понять здесь?
Ты разберись, как вообще работает рекурсия (на чем-то самом простом), а потом будешь пытаться применить ее в своей задаче.
lopata
5.01.2010 18:38
Что такое рекурсия теоретически я понимаю. Понимаю как работают примеры вычесления факториала, послед. Финабоччи и возведения в степень. Дальше дело не идет(
andriano
5.01.2010 19:55
Цитата(lopata @ 5.01.2010 18:38)
Что такое рекурсия теоретически я понимаю. Понимаю как работают примеры вычесления факториала, послед. Финабоччи и возведения в степень. Дальше дело не идет(
Расскажи. Отсюда и "начнем плясать".
lopata
5.01.2010 21:11
по идее Wegs(Wort) := Wegs(wort)-3+Wegs(wort-2) Wegs(3) = 3
*Wegs- кол-во путей *Wort - кол-во букв
TarasBer
5.01.2010 21:32
Непонятно. Wegs(Wort) := Wegs(Wort)-3+Wegs(Wort-2) - это не рекурсивное математическое определение, так как справа тоже стоит Wers(Wort), который мы и пытаемся определить.
lopata
5.01.2010 21:36
тогда я совсем не поняла( Wegs := Wegs(Wort)-3+Wegs(Wort-2)
andriano
5.01.2010 21:38
Хорошо, что значит? i := i+1;
lopata
5.01.2010 21:41
значение увеличивается на единицу...
andriano
5.01.2010 21:51
Вот то же самое происходит и с функцией: она вызывает сама себя с ДРУГИМ(!) значением параметра и из полученных чисел формирует собственное возвращаемое значение. Т.е. справа - результат вызова других экземпляров функции, а слева - значение, которое она вернет наружу.
Кстати, обрати внимание, если при рекурсивном вызове значение параметра не изменяется, то рекурсия не когда не может закончиться. Т.е. ВСЕГДА нужно проверять, чтобы 1. Передаваемое п рекурсии значение не совпадало с входным 2. Существовало корректное условие завершения рекурсии.
lopata
5.01.2010 22:08
Вроде. Путь(n) = Путь(n-2) + 2 в / например Путь(5)= Путь(3)+ 2 в степени 2.. степень увеличивается на 1..
или вот еще один бред: Путь(7)= Путь(5) +(Путь(5) -Путь(3))*2
TarasBer
5.01.2010 22:33
Уже ближе к истине, но всё равно - как в итоге выглядит общая формула f(n) = ?
lopata
5.01.2010 23:36
судя по тому, что было выше, то: *ну да f (n):= f(n-2)+ (f(n-4)-f(n-2))*2
больше пока идей нету..
TarasBer
5.01.2010 23:48
Что здесь такое f-2? Перечитай хотя бы то, что написала.
lopata
6.01.2010 1:38
я имела в виду: f (n):= f(n-2)+ (f(n-2)-f(n-4))*2 но оно все равно неверно
volvo
6.01.2010 1:55
Давай пойдем другим путем, ты перестанешь гадать, и начнешь рассуждать, договорились? Начнем с самого простого варианта твоего "дерева": допустим, что оно выглядит так:
1
2 3 4
(разные значения узлов - просто чтоб проще ориентироваться). Представила себе это? Допустим (я говорю, допустим, пока), тебе уже известно, сколько путей пожара есть от вершины "2", от вершины "3" и от вершины "4".
А теперь добавляем еще один уровень, внизу:
1
2 3 4
5 6 7 8 9
Как теперь, зная, сколько путей есть из "2" и из "3", найти, сколько путей есть из "5" или из "6"?
lopata
6.01.2010 2:23
Договорились. Насколько мой воспаленный мозг соображает: То есть из "5" будет столько же путей сколько и из "2" , ; из "6" будет столько путей сколько из "3" +из "2"
Добавлено через 9 мин. из середины и из вершин только один путь.
volvo
6.01.2010 2:34
Цитата
из "7" тоже столько сколько и из "5".
А я не говорил ,что тебе известно число путей из "5", заметь... Кроме того, вершины "5" и "7" никак не связаны между собой, поэтому и при вычислении f("7") - обозначим это так - ты не должна рассматривать f("5"). Семерка связана ТОЛЬКО с "3", поэтому придется тебе выражать количество путей из "7" через количество путей из "3"...
Цитата
из "6" будет столько путей сколько из "3" +1 ;
Неправда... Из "6" ты можешь пойти либо через "2" (тогда число путей будет равно тому, что нам известно для "2"), либо через "3" (тогда число путей совпадет с их числом для "3"). А всего их будет f("6") = f("2") + f("3")
Возражения?
lopata
6.01.2010 2:37
Да, это я поняла.
lopata
6.01.2010 4:28
если честно, не смогла применить эту логику... поэтому просто подогнала формулу..
andriano
6.01.2010 13:01
В данном случае мне кажется более продуктивным №обратить" задачу. Т.е. двигаться по дереву не от основания к вершине (в направлении распространения пламени), а от вершины к основанию (т.е. в обратном направлении). Очевидно, в каждой вершине образуются два новых пути кроме центрального ствола, где их три.
volvo
6.01.2010 14:18
Цитата
поэтому просто подогнала формулу..
Ну, и что у тебя получилось? Какова окончательная "подогнанная" формула?
lopata
6.01.2010 18:18
f(n)=f(n-1)*2+1
TarasBer
6.01.2010 18:42
И как же тогда будет выглядеть код функции на паскале?
volvo
6.01.2010 18:55
Цитата
f(n)=f(n-1)*2+1
Это неправильная формула. По крайней мере ты не вычислишь по ней ничего. Чему, скажем, равно F(1)?
lopata
6.01.2010 18:56
тогда я вообще не понимаю/
volvo
6.01.2010 19:02
Тебе уже неоднократно говорили, что надо ставить граничные условия. Если б ты написала, что f(n) = f(n-1) * 2 + 1; f(0) = 0 - это уже можно было бы запрограммировать. А так у тебя нет ни малейшего шанса дождаться вычисления по приведенной тобой формуле: программа все время будет искать предыдущее значение. До бесконечности. Практически же все окончится гораздо раньше: как только переполнится стек - программа вылетит с ошибкой.
Вот, например, формула, которая выдаст правильный ответ (если правильно запрограммировать функцию, и правильно ее вызвать): f(0) = 0; f(1) = 1; f(n) = f(n - 1) + 2(f(n - 2) + 1)
lopata
6.01.2010 19:19
а если я сделаю так:
FUNCTION f(n : longint) : Longint;
BEGINIF n = 1THEN f := 1ELSE f := f(n-2)*2+1END;
?
Добавлено через 3 мин. вычисляет верно..
TarasBer
6.01.2010 19:57
> вычисляет верно..
Ну и хорошо.
Добавлено через 2 мин. От себя добавлю: я даже не буду придираться к *2 вместо shl 1, всё равно пытаться оптимизировать вычисление степени двойки через рекурсию бесполезно, а если уж оптимизировать, то ответ писать в виде f := 1 shl (n shr 1 + 1) - 1, но он, увы не соответствую требованию задания непременно воткнуть рекурсию.
lopata
6.01.2010 20:21
но все равно ведь формула должна быть другая..
TarasBer
6.01.2010 20:32
Формула правильная, в чём проблема?
lopata
6.01.2010 20:36
не знаю. просто я очень долго мучалась. пыталась найти какие-то решения. а тут раз и ..
lopata
6.01.2010 22:58
всем большое спаcибо.
lopata
12.01.2010 11:30
Volvo,спасибо) оказывается эта логика очень даже пригодилась. нужно было сделать функцию с 2 параметрами: номер уровня и номер буквы по счету.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.