рекурсивнвный подсчет как распределить мальчиков и девочек, у меня даже идеи нету как ее делать |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
рекурсивнвный подсчет как распределить мальчиков и девочек, у меня даже идеи нету как ее делать |
maksimla |
Сообщение
#1
|
Знаток Группа: Пользователи Сообщений: 324 Пол: Мужской Реальное имя: maksim Репутация: 1 |
В поездке ученики прибыли в 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 Репутация: 1 |
Вот кажется разобрался как вызвать
кажется все правильно и вызывает и результат выводит и разобрался вот с этим 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 |
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 Репутация: 1 |
даже незнаю можетбыть более менее понятно спасибо
-------------------- Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
|
Текстовая версия | 29.04.2024 9:10 |