![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
maksimla |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: ![]() ![]() ![]() |
В поездке ученики прибыли в n (0 < n ≤ 15) этажный дом. На одном этаже могут жить только одного пола дети.Учительница должда распределить их придерживаясь правилам с этажом нижей девочки могут жить над мальчиками и над девочками но мальчики могут жить только над девачками. На первом этаже могут жить и девачки и мальчики.
Напишите программу котоорая данным n написала сколько всго можит быть вариантов расселения учеников. Два разных варианта расселения считаются разными когда на одном сперва мальчики а потом девочки живут. Первичные данные 3 результат 5 Обьяснение когда n = 3 то тогда вариантов расселения есть 5 ддд,мдд,дмд,мдм,ддм. Д это девачка М это мальчик. Но ммд и дмм так неможит быть. Я совсем нечего непридумал как надо сделать и как останавливать сам цикл может дадите идею как это так сделать -------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ну, так и пиши, по заданию:
function count(const n: integer; s: string): integer;Как вызвать - разберешься? Это работает. Для 5 этажей выдает 13 комбинаций, для 12-ти этажей - 377, ... Разберись, как оно работает, и допиши программу... Добавлено через 1 мин. P.S. В принципе, можно, подобрать формулу, вычисляющую ответ без перебора (в общем-то оно и без подбора ясно: это все числа Фибоначчи), но у тебя в задании именно рекурсия, придется вычислять. |
maksimla |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: ![]() ![]() ![]() |
Вот кажется разобрался как вызвать
кажется все правильно и вызывает и результат выводит и разобрался вот с этим s[length(s)] = 'Д' program Bevarde2; но запутался в рекурсии как она так считает нечего непонял хоть выполнял с n=2 и пошагово count := count(n, s + 'М') + count(n, s + 'Д') и тут ведь наверное ошибка должна быть это мне просто так кажется вот и незнаю как тут складывается и как выполняется все остальное Добавлено через 6 мин. И тут если взять что я вижу то только n=2 то тогда результат МД все s + 'М' это так понимаю ![]() Добавлено через 2 мин. а я даже и неподумал что это числа Фибоначчи -------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата и тут ведь наверное ошибка должна быть Ну, если б должна была быть - тебе бы наверное компилятор сказал бы об этом? Раз не говорит - значит нету ![]() Опять же, ты, видимо до сих пор с рекурсией не разобрался... Ее не пошагово прогонять надо, а взять лист бумаги и написать все, что куда передается. Вот смотри (для простоту возьмем N = 2): 0) count(2, ''); s = '', условие выхода не достигнуто, продолжаем: s = '', значит результат будет равен count(2,'m')+count(2,'f') 1) count(2, 'm'): s = 'm', опять же выходить рано, идем дальше: последний символ = 'm', значит результат будет = count(2,'mf') a) count(2, 'mf'); s = 'mf', все, дошли до второго этажа, результат = 1, он передается НАЗАД, в предыдущую формулу, в пункте (1), то есть, count(2,'m') = count(2,'mf') = 1... Это в свою очередь возвращается в формулу (0): count(2, '') = count(2,'m') + count(2,'f') = (заменяем рекурсивный вызов уже полученным результатом) = 1 + count(2,'f') (формула №4) Что у нас осталось неизвестным? Count(2, 'f')? Вот так же, как я расписывал все предыдущие вызовы, распиши это, и посмотри, чему будет равно это выражение, а потом результат подставишь в формулу №4 и увидишь, чему будет равно общее значение функции... |
maksimla |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: ![]() ![]() ![]() |
1 b) по условию count(2,'f') сравниваем s[length(s)] = 'f' да и тогда будит результат равен count(2,'fm')+count(2,'ff')
2) a) count(2,'fm') s = 'fm', все, дошли до второго этажа, результат = 1, он передается НАЗАД, в предыдущую формулу, в пункте (1 b), count(2,'fm')+count(2,'ff') 1+count(2,'ff') 2 b) s = 'fm', все, дошли до второго этажа, результат = 1, он передается НАЗАД, в предыдущую формулу, в пункте (1 b), count(2,'fm')+count(2,'ff') count:=1+1; 3) count:=1+1; передается в пункт 0 и получается count:=1+2; и тогда count:=3; -------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Молодец. Теперь понятнее, как собирается конечный результат в рекурсивных функциях?
|
maksimla |
![]()
Сообщение
#7
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: ![]() ![]() ![]() |
даже незнаю можетбыть более менее понятно спасибо
-------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 14:05 |