ГоловнаСтаттіАлгоритми та Штучний Інтелект

Вежа Hanoi: Рекурентна Задача з Доведено Оптимальним Розв’язком

Перемістіть N дисків між трьома пілонами, не розміщуючи більший диск на меншому – оптимальне рішення потребує точно 2^N-1 ходів, а рекурсія це доводить.

mysimulator teamОновлено — червень 2026≈ 7 хв читання▶ Відкрити симуляцію

Правила та рекурсивне розуміння

Три опори, N дисків різних розмірів, стовпчиком від найменшого до найбільшого на першій опорі. Переміщайте кожен диск до третьої опори по одному, не кладіть більший диск на менший. Едвард Лукас вигадав цю головоломку в 1883 році, обгорнуту легендою про в’єтнамських монахів, які переносили 64 золотих диски. Це робить її улюбленим прикладом для навчання, оскільки оптимальне рішення прямо випливає з рекурсивного способу мислення про проблему, а не з будь-якого розумного пошуку.

Щоб перемістити N дисків від опори A до опори C за допомогою опори B як допоміжної, зверніть увагу, що найнижчий диск не може рухатися нікуди, поки всі диски над ним не будуть виставлені на місце, і єдине місце, куди можуть бути переміщені N-1 менших дисків, залишаючи нижній диск вільним, — це повністю на допоміжну опору. Це спостереження є цілим алгоритмом:

function hanoi(n, from, to, via) {
  if (n === 0) return;
  hanoi(n - 1, from, via, to);   // move top n-1 disks out of the way
  moveDisk(from, to);            // move the (now exposed) largest disk
  hanoi(n - 1, via, to, from);   // move the n-1 disks onto the largest
}
hanoi(N, 'A', 'C', 'B');
жива демонстрація · пов'язана симуляція● LIVE

Чому кількість рухів дорівнює 2^N - 1

Нехай M(n) — це мінімальна кількість рухів для переміщення n дисків. Рекурентне рівняння, яке ми використовували, переміщує n-1 дисків двічі (один раз назовні та один раз на кінцеву кілочку) плюс один окремий рух найбільшого диска, що дає рекурентне рівняння M(n) = 2 * M(n - 1) + 1, де M(0) = 0. Розгортаючи його: M(n) = 2 * (2 * M(n - 2) + 1) + 1 = 4 * M(n - 2) + 3 = ... = 2^(n-1) * M(0) + (2^(n-1) - 1) = 2^(n-1) - 1. Це можна також довести як оптимальне, а не просто досяжне, за допомогою простого аргументу обміну: найбільший диск повинен рухатися принаймні один раз, і перш ніж він зможе рухатися, всі інші диски повинні бути вже зняті з нього та з кінцевої кілочки, що займає принаймні M(n-1) рухів - отже, M(n) ≥ 2 * M(n-1) + 1 як нижню межу також, яка точно відповідає рекурентному побудові.

Для N=64 золотих дисків, як у Лелюсиних легендах, тобто 2^64 - 1 ≈ 1.8 * 10^18 рухів. При одному русі за секунду завершення зайняло б більше часу, ніж поточна оцінка віку Всесвіту – ця головоломка є стандартним способом зробити експоненційне зростання відчутно конкретним, оскільки додавання лише одного додаткового диска завжди точно подвоює залишок роботи плюс один рух.

Последовательность ходов имеет красивый битовый узор

Номерьте ходы 1, 2, 3, ..., до 2^N - 1. Какая пластина перемещается на ходе k определяется чисто своим двоичным представлением: пластина, которая перемещается на ходе k, находится в позиции самого младшего установленного бита k (считая от 1), то есть на одном больше, чем количество ведущих нулей в двоичном представлении k. Ход 1 (двоичный 1) перемещает диск 1; ход 2 (двоичный 10) перемещает диск 2; ход 4 (двоичный 100) перемещает диск 3; ход 6 (двоичный 110) снова перемещает диск 2. Это дает совершенно нерекурсивный способ сгенерировать одну и ту же оптимальную решение - итерируйте k от 1 до 2^N - 1, извлеките самый младший установленный бит, переместите эту пластину в единственный доступный для нее направлении (направление каждой пластины циклически меняется между тремя опорами, и для четного vs нечетного N самая маленькая пластина циклирует A->C->B->A или A->B->C->A соответственно) - это красивое иллюстрация того, как чисто рекурсивное определение и чисто комбинаторный битовый трюк могут вычислить точно один и тот же объект.

Загальне: чотири опори та гіпотеза Frame-Stewart

Додавання четвертої опори повинно зробити головоломку суворо легшою, і це сталося – але оптимальна кількість ходів для 4-опорної версії, відома як числа Frame-Stewart, була доведена правильно лише в 2014 році (Бусш), десятиліття після того, як Frame та Stewart незалежно запропонували цю рекурсивну стратегію у 1941 році. Ідея полягає в тому, щоб перемістити оптимально обраний префікс найменших дисків до запасної опори за допомогою всіх чотирьох опор, перемістити залишок більших дисків до пункту призначення за допомогою класичного алгоритму 3-опорної версії (оскільки одна опора зараз зайнята префіксом), а потім повернути префікс на готовий стовп за допомогою всіх чотирьох опор знову. Знаходження оптимальної точки поділу вимагає спробувати всі можливі розміри префікса та вибрати мінімальне значення, але протягом тривалого часу ніхто не міг довести, що не існує розумнішої стратегії без попередження, яка не могла б зробити краще – рідкісний випадок, коли проста дитяча головоломка має відкрите наукове питання, пов'язане з нею понад 70 років.

Frequently asked questions

Чому мінімальна кількість ходів дорівнює 2^N - 1, а не менша?

Тому що перед тим, як найбільший диск може здійснити хоча б один крок, усі N-1 менші диски вже повинні бути переміщені з поточного штифта та штифта призначення – що вимагає щонайменше стільки ж ходів, скільки потрібно для розв’язання головоломки з (N-1) дисками. Це дає рекурентне співвідношення M(n) ≥ 2·M(n-1)+1, і алгоритм рекурсії досягає цього обмеження точно, тому він доведене оптимальне.

Чи є спосіб розв’язати вежу Ханьо без рекурсії?

Так – диск, який переміщується на кроці k оптимального рішення, завжди визначається положенням найнижчого біта в двійковій системі чисельності k, а напрямок руху кожного диска циклічно змінюється між трьома штифтами. Це дає простий ітеративний цикл, який відтворює точну саму оптимальну послідовність ходів, як у рекурсивному алгоритмі.

Чи робить додавання четвертого штифта швидшим розв’язання головоломки?

Так, суттєво – оптимальна кількість ходів для 4-штистичного варіанту (числа Frame-Stewart) зростає набагато повільніше, ніж 2^N-1. Однак доведення стандартної рекурсивної стратегії для 4-штистичної вежі є оптимальною, а не просто гарною евристикою, було відкритою проблемою з 1941 року, поки її остаточно не вирішили лише в 2014 році.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Tower of Hanoi і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Tower of Hanoi

Що ви знайшли?

Додати кроки відтворення (опційно)