Не только слово XTREE , все слова с нечетным количеством букв подходят для "ёлочной" рекурсии. Все буквы слова расположены в форме ёлки.
Для слова XTREE получается след. ёлка :
http://keep4u.ru/full/d7bf8668f942fe599d4b4b3b7251fa97.html
Представьте себе, что вы уполномоченный по безопасности пожарной службы. Сколько возможных путей пожара до верхушки, если одна буква на самом нижнем уровне зажигается через одну свечку и огонь может распростроняться тольк вверх и вправо-вверх (в левой половине дерева) и соответсвенно влево-вверх (в правой половине дерева).
Ответьте на вопрос рекурсивным математическим определением функции XFire и реализуйте в паскале.
Помогите, пожалуйста, разобраться. Не понимаю вообще как решать задачу.
В какую сторону идти?
Для начала почитать что-нибудь про рекурсию.
Этого достаточно.
Для начала я почитала. И тем не менне непонятно... Я понимаю, что это моя проблема в непонимании. Но прошу помочь как-нибудь..
И чего ты хочешь?
Чтобы тебе пересказали то же самое, но своими словами?
Я не знаю. Просто объяснить как рекурсия работает на этом примере.
Что такое рекурсия теоретически я понимаю. Понимаю как работают примеры вычесления факториала, послед. Финабоччи и возведения в степень. Дальше дело не идет(
по идее Wegs(Wort) := Wegs(wort)-3+Wegs(wort-2)
Wegs(3) = 3
*Wegs- кол-во путей
*Wort - кол-во букв
Непонятно.
Wegs(Wort) := Wegs(Wort)-3+Wegs(Wort-2) - это не рекурсивное математическое определение, так как справа тоже стоит Wers(Wort), который мы и пытаемся определить.
тогда я совсем не поняла(
Wegs := Wegs(Wort)-3+Wegs(Wort-2)
Хорошо, что значит?
i := i+1;
значение увеличивается на единицу...
Вот то же самое происходит и с функцией: она вызывает сама себя с ДРУГИМ(!) значением параметра и из полученных чисел формирует собственное возвращаемое значение.
Т.е. справа - результат вызова других экземпляров функции, а слева - значение, которое она вернет наружу.
Кстати, обрати внимание, если при рекурсивном вызове значение параметра не изменяется, то рекурсия не когда не может закончиться. Т.е. ВСЕГДА нужно проверять, чтобы
1. Передаваемое п рекурсии значение не совпадало с входным
2. Существовало корректное условие завершения рекурсии.
Вроде.
Путь(n) = Путь(n-2) + 2 в /
например Путь(5)= Путь(3)+ 2 в степени 2..
степень увеличивается на 1..
или вот еще один бред:
Путь(7)= Путь(5) +(Путь(5) -Путь(3))*2
Уже ближе к истине, но всё равно - как в итоге выглядит общая формула
f(n) = ?
судя по тому, что было выше, то: *ну да
f (n):= f(n-2)+ (f(n-4)-f(n-2))*2
больше пока идей нету..
Что здесь такое f-2? Перечитай хотя бы то, что написала.
я имела в виду:
f (n):= f(n-2)+ (f(n-2)-f(n-4))*2
но оно все равно неверно
Давай пойдем другим путем, ты перестанешь гадать, и начнешь рассуждать, договорились? Начнем с самого простого варианта твоего "дерева": допустим, что оно выглядит так:
1(разные значения узлов - просто чтоб проще ориентироваться). Представила себе это? Допустим (я говорю, допустим, пока), тебе уже известно, сколько путей пожара есть от вершины "2", от вершины "3" и от вершины "4".
2 3 4
1Как теперь, зная, сколько путей есть из "2" и из "3", найти, сколько путей есть из "5" или из "6"?
2 3 4
5 6 7 8 9
Договорились.
Насколько мой воспаленный мозг соображает:
То есть из "5" будет столько же путей сколько и из "2" , ;
из "6" будет столько путей сколько из "3" +из "2"
Добавлено через 9 мин.
из середины и из вершин только один путь.
Да, это я поняла.
если честно, не смогла применить эту логику...
поэтому просто подогнала формулу..
В данном случае мне кажется более продуктивным №обратить" задачу. Т.е. двигаться по дереву не от основания к вершине (в направлении распространения пламени), а от вершины к основанию (т.е. в обратном направлении).
Очевидно, в каждой вершине образуются два новых пути кроме центрального ствола, где их три.
f(n)=f(n-1)*2+1
И как же тогда будет выглядеть код функции на паскале?
тогда я вообще не понимаю/
Тебе уже неоднократно говорили, что надо ставить граничные условия. Если б ты написала, что
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)
а если я сделаю так:
FUNCTION f(n : longint) : Longint;
BEGIN
IF n = 1 THEN f := 1
ELSE f := f(n-2)*2+1
END;
> вычисляет верно..
Ну и хорошо.
Добавлено через 2 мин.
От себя добавлю: я даже не буду придираться к *2 вместо shl 1, всё равно пытаться оптимизировать вычисление степени двойки через рекурсию бесполезно, а если уж оптимизировать, то ответ писать в виде f := 1 shl (n shr 1 + 1) - 1, но он, увы не соответствую требованию задания непременно воткнуть рекурсию.
но все равно ведь формула должна быть другая..
Формула правильная, в чём проблема?
не знаю. просто я очень долго мучалась. пыталась найти какие-то решения. а тут раз и ..
всем большое спаcибо.
Volvo,спасибо) оказывается эта логика очень даже пригодилась.
нужно было сделать функцию с 2 параметрами: номер уровня и номер буквы по счету.