Добрый день!
Изучаю программирование по учебнику Андрея Столярова. Тема - язык Паскаль и начала программирования. Вопрос касается, в частности, решения задачи 2.12. из задачника того же автора.
"Необходимо построить «ромбик»/«алмаз» из пробелов на фоне, заполненном звездочками. Так, если ввести число 5, программа должна напечатать следующее: "
*******
*** ***
** **
* *
** **
*** ***
*******
Задачу легко решил следующим образом, всё прекрасно работает:
program diamond_cutout;
procedure PrintChars(count: integer);
var
i: integer;
begin
for i := 1 to count do
write('*')
end;
procedure PrintSpaces(count: integer);
var
i: integer;
begin
for i := 1 to count do
write(' ')
end;
procedure PrintLineOfDiamond(i, HH: integer);
begin
PrintChars(HH + 2 - i);
PrintSpaces(2 * i - 1);
PrintChars(HH + 2 - i);
writeln
end;
procedure PrintFirstLastLineOfDiamond(H: integer);
begin
PrintChars(H + 2);
writeln
end;
var
HalfHeight, i, Height: integer;
begin
repeat
write('Enter the diamond''s height (positive, odd)');
readln(Height);
until (Height > 0) and (Height mod 2 = 1);
HalfHeight := Height div 2;
PrintFirstLastLineOfDiamond(Height);
for i := 1 to (HalfHeight + 1) do
PrintLineOfDiamond(i, HalfHeight);
for i := HalfHeight downto 1 do
PrintLineOfDiamond(i, HalfHeight);
PrintFirstLastLineOfDiamond(Height)
end.
Затем, поскольку недавно я прошёл материал по рекурсии, я решил заменить процедуры PrintChars и PrintSpaces на аналогичные, но с использованием рекурсии вместо цикла.
т.е. с
procedure PrintChars(count: integer);
var
i: integer;
begin
for i := 1 to count do
write('*')
end;
на
procedure PrintChars(count: integer);
begin
if count > 0 then
begin
write('*');
PrintChars(count - 1)
end
end;
Однако, хотя на выходе (по моему мнению) я должен был получить точно такой же результат как и раньше, я получил
*******
*** ***
** ****
* *****
** ****
*** ***
*******
Это означает, что я что-то неправильно понял в материале по рекурсии. В чём моя ошибка? Почему модифицированный код даёт другой результат?