// داده‌های اسلایدها (محتوای HTML) const slides = [ // 1. Cover Slide { id: "cover", content: `

برج هانوی

تحلیل الگوریتم و روش حل بازگشتی

ارائه دهنده:

👤 رعنا نوجامه

استاد راهنما:

🎓 رویا عباسی

` }, // 2. History & Legend { id: "history", content: `

تاریخچه و افسانه

از معبد بنارس تا ریاضیات مدرن

این مسئله نخستین بار توسط ریاضیدان فرانسوی، ادوارد لوکاس در سال ۱۸۸۳ مطرح شد.

⏳ افسانه معبد بنارس

گفته می‌شود در معبدی راهبانی هستند که باید ۶۴ دیسک طلا را جابجا کنند. طبق افسانه، زمانی که آخرین حرکت انجام شود، جهان به پایان می‌رسد.

1883
اختراع ادوارد لوکاس
` }, // 3. Definition { id: "definition", content: `

تعریف مسئله

اجزای تشکیل دهنده

سیستم شامل سه میله (A, B, C) و تعدادی دیسک با اندازه‌های متفاوت است.

A
مبدأ (Source)
B
کمکی (Auxiliary)
C
مقصد (Target)

هدف نهایی: انتقال تمام دیسک‌ها از میله A به میله C.

` }, // 4. Rules { id: "rules", content: `

قوانین حرکت

محدودیت‌های سخت‌گیرانه

1

حرکت تکی

در هر نوبت فقط یک دیسک جابجا می‌شود.

2

دسترسی محدود

فقط بالاترین دیسک هر میله قابل برداشتن است.

3

قانون طلایی

دیسک بزرگتر هرگز نمی‌تواند روی دیسک کوچکتر قرار بگیرد.

` }, // 5. Recursive Thinking Intro { id: "recursion_concept", content: `

تفکر بازگشتی

حل مسئله با کوچک‌سازی

بازگشت (Recursion) یعنی حل یک مسئله بزرگ با تبدیل آن به نسخه‌های کوچکتری از همان مسئله.

ساختار تو در تو
⬇️ مسئله ۳ دیسک
⬇️ مسئله ۲ دیسک
⬇️ مسئله ۱ دیسک (ساده!)
` }, // 6. Strategy { id: "strategy", content: `

استراتژی حل

تقسیم و غلبه (Divide & Conquer)

فرض کنید می‌خواهیم N دیسک را جابجا کنیم. اگر بتوانیم N-1 دیسک را جابجا کنیم، مسئله حل شده است.

1

آزادسازی

توده N-1 تایی را به میله کمکی ببر تا بزرگترین دیسک آزاد شود.

2

حرکت اصلی

دیسک بزرگ (N) را مستقیم به مقصد نهایی ببر.

3

پایان کار

توده N-1 تایی را از میله کمکی روی دیسک بزرگ (در مقصد) قرار بده.

` }, // 7. Algorithm Diagram { id: "algorithm_visual", content: `

دیاگرام فرایند

نقشه راه الگوریتم

حل مسئله برای N دیسک
N-1 به کمکی
دیسک N به مقصد
N-1 به مقصد

این چرخه برای N-1 دوباره تکرار می‌شود تا به N=1 برسیم.

` }, // 8. Demo { id: "demo", content: `

شبیه‌سازی تعاملی

` }, // 9. Recurrence Relation Basic { id: "recurrence_basic", content: `

تشکیل رابطه بازگشتی

مدل‌سازی ریاضی مسئله

برای محاسبه تعداد کل حرکات T(n)، مسئله را به سه بخش تقسیم می‌کنیم:

T(n) = T(n-1) + 1 + T(n-1)

T(n) = 2T(n-1) + 1
` }, // 10. Step-by-Step Expansion { id: "step_expansion", content: `

حل گام‌به‌گام معادله

روش جایگذاری مکرر (Substitution)

بیایید معادله را باز کنیم تا ببینیم چه الگویی پدیدار می‌شود:

Step 1: T(n) = 2T(n-1) + 1
می‌دانیم که: T(n-1) = 2T(n-2) + 1
پس جایگذاری می‌کنیم:
Step 2: T(n) = 2[2T(n-2) + 1] + 1
= 4T(n-2) + 2 + 1
Step 3: T(n) = 4[2T(n-3) + 1] + 2 + 1
= 8T(n-3) + 4 + 2 + 1
` }, // 11. Pattern Recognition { id: "pattern_rec", content: `

کشف الگو

تعمیم به مرحله k ام

اگر این روند را k بار ادامه دهیم، به فرم کلی زیر می‌رسیم:

T(n) = 2^k T(n-k) + (2^{k-1} + ... + 2 + 1)

شرط توقف (Base Case)

این روند تا زمانی ادامه می‌یابد که به n-k = 1 برسیم (یعنی تنها ۱ دیسک باقی بماند).

Let k = n - 1
Then T(n-k) becomes T(1) = 1
` }, // 12. Final Proof { id: "final_proof", content: `

فرمول نهایی

مجموع تصاعد هندسی

با جایگذاری k = n - 1 در معادله قبلی:

T(n) = 2^{n-1} \times 1 + (2^{n-2} + ... + 4 + 2 + 1)

این یک سری هندسی است: Sum = 2^0 + 2^1 + ... + 2^{n-1}

⬇️
جواب نهایی
T(n) = 2^n - 1
مثال: برای ۳ دیسک -> 2^3 - 1 = 7 حرکت
` }, // 13. Architecture Application { id: "architecture", content: `

کاربرد در معماری

ارتباط الگوریتم با طراحی

طراحی مدولار

مانند برج هانوی که از قطعات کوچکتر تشکیل شده، سازه‌های پیچیده معماری نیز از تکرار واحدهای مدولار ساخته می‌شوند.

فرایندهای ساخت

در مدیریت پروژه ساخت، گاهی برای نصب یک جزء اصلی (فونداسیون)، باید اجزای مزاحم یا پیش‌نیاز را موقتاً جابجا کرد یا ساخت (فضای کمکی).

Self-Similarity
` }, // 14. Conclusion { id: "end", content: `

پایان

با تشکر از توجه شما

امیدوارم این ارائه دیدگاه روشنی نسبت به تفکر بازگشتی و ساختار الگوریتم برج هانوی ایجاد کرده باشد.

` } ]; // مدیریت وضعیت اسلایدها let currentSlideIndex = 0; const slideContainer = document.getElementById('slide-content'); const prevBtn = document.getElementById('btn-prev'); const nextBtn = document.getElementById('btn-next'); const counter = document.getElementById('slide-counter'); const progressFill = document.getElementById('progress-fill'); function renderSlide(index) { const slide = slides[index]; slideContainer.innerHTML = slide.content; // بروزرسانی UI counter.textContent = `${index + 1} / ${slides.length}`; progressFill.style.width = `${((index + 1) / slides.length) * 100}%`; prevBtn.disabled = index === 0; nextBtn.disabled = index === slides.length - 1; // اگر اسلاید بازی است، بازی را راه‌اندازی کن if (slide.id === "demo") { initHanoiGame(); } } // رویدادهای دکمه‌ها prevBtn.addEventListener('click', () => { if (currentSlideIndex > 0) { currentSlideIndex--; renderSlide(currentSlideIndex); } }); nextBtn.addEventListener('click', () => { if (currentSlideIndex < slides.length - 1) { currentSlideIndex++; renderSlide(currentSlideIndex); } }); // --- منطق بازی برج هانوی (Vanilla JS) --- function initHanoiGame() { const root = document.getElementById('hanoi-game-root'); if (!root) return; // ساختار HTML بازی root.innerHTML = `
آماده شروع
`; let towers = [[], [], []]; let moves = []; let isPlaying = false; let diskCount = 3; function setupGame() { towers = [[], [], []]; const tower0 = document.getElementById('tower-0'); const tower1 = document.getElementById('tower-1'); const tower2 = document.getElementById('tower-2'); // پاک کردن دیسک‌های قبلی (به جز میله) [tower0, tower1, tower2].forEach(t => { const disks = t.querySelectorAll('.disk'); disks.forEach(d => d.remove()); }); // ساخت دیسک‌ها for (let i = diskCount; i >= 1; i--) { towers[0].push(i); const disk = document.createElement('div'); disk.className = `disk disk-${i}`; disk.id = `disk-${i}`; tower0.appendChild(disk); } moves = []; solveHanoi(diskCount, 0, 2, 1); document.getElementById('status-text').textContent = "آماده شروع"; } function solveHanoi(n, from, to, aux) { if (n === 0) return; solveHanoi(n - 1, from, aux, to); moves.push({ n, from, to }); solveHanoi(n - 1, aux, to, from); } async function play() { if (isPlaying) return; isPlaying = true; document.getElementById('play-btn').disabled = true; document.getElementById('disk-select').disabled = true; for (let move of moves) { if (!isPlaying) break; // توقف در صورت ریست document.getElementById('status-text').textContent = `دیسک ${move.n} از ${getTowerName(move.from)} به ${getTowerName(move.to)}`; await moveDisk(move.from, move.to); await new Promise(r => setTimeout(r, 800)); } isPlaying = false; document.getElementById('play-btn').disabled = false; document.getElementById('disk-select').disabled = false; document.getElementById('status-text').textContent = "پایان"; } function moveDisk(fromIdx, toIdx) { return new Promise(resolve => { const fromTower = document.getElementById(`tower-${fromIdx}`); const toTower = document.getElementById(`tower-${toIdx}`); const disk = fromTower.lastElementChild; // آخرین دیسک (بالاترین) if (disk && disk.classList.contains('disk')) { // انیمیشن ساده: حذف و اضافه کردن به برج جدید disk.style.opacity = '0.5'; setTimeout(() => { toTower.appendChild(disk); disk.style.opacity = '1'; resolve(); }, 200); } else { resolve(); } }); } function getTowerName(idx) { return idx === 0 ? "A" : idx === 1 ? "B" : "C"; } // Event Listeners برای دکمه‌های بازی document.getElementById('disk-select').addEventListener('change', (e) => { diskCount = parseInt(e.target.value); isPlaying = false; setupGame(); }); document.getElementById('reset-btn').addEventListener('click', () => { isPlaying = false; document.getElementById('play-btn').disabled = false; document.getElementById('disk-select').disabled = false; setupGame(); }); document.getElementById('play-btn').addEventListener('click', play); // راه‌اندازی اولیه setupGame(); } // شروع برنامه renderSlide(0);