Логика реализуется следующей процедурой:
Код:
(*
** This recursive procedure moves all disks from
** peg with number stored in SourcePeg variable
** to peg defined by DestinationPeg value,
** preserving its increasing order (lower disk
** always lies on top of any subset of disks).
*)
procedure Hanoi(Disks,SourcePeg,DestinationPeg: integer);
var AuxiliaryPeg: word;
begin
if Disks=0 then exit;
// Find free peg (using fact that
// sum of all pegs is six).
AuxiliaryPeg:=6-SourcePeg-DestinationPeg;
// Move all but one disk from source
// to free peg.
Hanoi(Disks-1,SourcePeg,AuxiliaryPeg);
// Move bottom disk to destination peg.
MoveDisk(SourcePeg,DestinationPeg);
// Return disks from auxiliary peg
// to destination.
Hanoi(Disks-1,AuxiliaryPeg,DestinationPeg);
end;
Использование:
Hanoi(DisksCount,1,3);TODO:
- Определить процедуру MoveDisk(SourcePeg,DestinationPeg), перемещающую диск со стержня SourcePeg на стержень DestinationPeg (эта процедура может просто печатать очередной ход в консоль или же проигрывать анимацию диска, перелетающего со стержня на стержень).
- Попробовать раскрыть рекурсию (очень полезное упражнение).
- Создать оболочку (добавить форму, поля ввода, кнопки, etc). Считывать данные (e.g. количество дисков) можно из элемента управления типа TEdit, например так: DisksCount:=StrToInt(EditBox.Text), а вывод можно производить добавляя записи в элемент типа TListBox: ListBox.Items.Add(format('%d -> %d',[SourcePeg,DestinationPeg])).