d;// Кут, під яким росте дерево: extended;// Довжина стовбура: integer// Кількість розгалужень (скільки ще належить рекурсивних викликів)
);, y2: extended;// Кінець ствола (точка розгалуження)
begin: = x + TrunkLength * cos (Angle);: = y - TrunkLength * sin (Angle);. MoveTo (round (x), round (y));. LineTo (round (x2), round ( y2)); n> 1 then (Canvas, x2, y2, Angle + Pi/4, 0.55 * TrunkLength, n-1); (Canvas, x2, y2, Angle-Pi/4, 0.55 * TrunkLength, n- 1);
end;
Для отримання рис. 6 ця процедура була викликана з наступними параметрами: (Image1.Canvas, 175, 325, Pi/2, 120, 15);
Зауважимо, що малювання здійснюється до рекурсивних викликів, тобто дерево малюється в прямому порядку.
.2 Ханойські вежі
Згідно з легендою у Великому храмі міста Бенарас, під собором, що відзначає середину світу, знаходиться бронзовий диск, на якому укріплені 3 алмазних стрижня, висотою в один лікоть і завтовшки з бджолу. Давним-давно, на самому початку часів ченці цього монастиря завинили перед богом Брамою. Розгніваний, Брама спорудив три високих стрижня і на один з них помістив 64 диска з чистого золота, причому так, що кожен менший диск лежить на більшому. Як тільки всі 64 диска будуть перекладені зі стрижня, на який Бог Брама склав їх при створенні світу, на інший стрижень, башта разом з храмом звернуться в пил і під громові гуркіт загине світ. p> У процесі потрібно, щоб більший диск жодного разу не опинявся над меншим. Ченці в скруті, в якій же послідовності варто робити перекладання? Потрібен забезпечити їх софтом для розрахунку цієї послідовності. p> Незалежно від Брами дану головоломку в кінці 19 століття запропонував французький математик Едуард Люка. У продаваемом варіанті зазвичай використовувалося 7-8 дисків (рис. 7). br/>В
Рис. 7. Головоломка В«Ханойські вежіВ». br/>
Припустимо, що існує рішення для n-1 диска. Тоді для перекладання n дисків треба діяти наступним чином:
) Перекладаємо n-1 диск.
) Перекладаємо n-й диск на що залишився вільним штир.
) Перекладаємо стопку з n-1 диска, отриману в пункті (1) поверх n-го диска.
Оскільки для випадку n = 1 алгоритм перекладання очевидний, то по індукції за допомогою виконання дій (1) - (3) можемо перекласти довільну кількість дисків.
Створимо рекурсивну процедуру, друкувальну всю послідовність перекладань для заданої кількості дисків. Така процедура при кожному своєму виклик повинна друкувати інформацію про один перекладанні (з пункту 2 алгоритму). Для перекладань з пунктів (1) і (3) процедура викличе сама себе із зменшеним на одиницю кількістю дисків. p>// n - кількість дисків
// a, b, c - номери штирьків. Перекладання проводиться зі штирька a,
// на штирьок b при допоміжному штирьком c.
Hanoi (n, a, b, c: integer); n> 1 then (n-1, a, c, b); (a, '->', b); (n-1, c, b, a); else (a, '->', b);
end;
Зауважимо, що безл...