В поездке ученики прибыли в n (0 < n ≤ 15) этажный дом. На одном этаже могут жить только одного пола дети.Учительница должда распределить их придерживаясь правилам с этажом нижей девочки могут жить над мальчиками и над девочками но мальчики могут жить только над девачками. На первом этаже могут жить и девачки и мальчики.
Напишите программу котоорая данным n написала сколько всго можит быть вариантов расселения учеников. Два разных варианта расселения считаются разными когда на одном сперва мальчики а потом девочки живут.
Первичные данные
3
результат
5
Обьяснение
когда n = 3 то тогда вариантов расселения есть 5 ддд,мдд,дмд,мдм,ддм.
Д это девачка М это мальчик.
Но ммд и дмм так неможит быть.
Я совсем нечего непридумал как надо сделать и как останавливать сам цикл может дадите идею как это так сделать
Ну, так и пиши, по заданию:
function count(const n: integer; s: string): integer;Как вызвать - разберешься?
begin
if length(s) = n then begin { условие выхода: число этажей достигнуто }
writeln(s); count := 1;
end
else begin
if (s = '') or (s[length(s)] = 'f') then
{ или первый этаж, или над девочками - могут быть кто угодно }
count := count(n, s + 'm') + count(n, s + 'f')
else
{ над мальчиками - только девочки }
count := count(n, s + 'f');
end;
end;
Вот кажется разобрался как вызвать
program varenti_raspredilenija;
function count(const n: integer; s: string): integer;
begin
if length(s) = n then begin
writeln(s); count := 1;
end
else begin
if (s = '') or (s[length(s)] = 'Д') then
count := count(n, s + 'М') + count(n, s + 'Д')
else
count := count(n, s + 'Д');
end;
end;
var x:integer;
begin
WriteLn('Vvedi cislo ot 0 do 15');
Readln(x);
writeln(count(x,''));
readln;
end.
program Bevarde2;
var s:string;
begin
s:='МД';
WriteLn(s[length(s)] = 'Д');
Readln;
end.
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;
Молодец. Теперь понятнее, как собирается конечный результат в рекурсивных функциях?
даже незнаю можетбыть более менее понятно спасибо