PDA

View Full Version : سوال: اشکال در قسمتی از الگوریتم برج هانوی



alireza2220
سه شنبه 29 آذر 1390, 15:17 عصر
با سلام دوستان
من این الگوریتمو از بعد از else نمیفهمم سرچ هم کردم اما باز هم متوجه نشدم
من این مطلب رو کلی فهمیدم اما سر الگریتم مشکل دارم یعنی نمی فهمم چه جوری حل میشه
مرسی.

static void Hanoi(int PL, char A, char B, char C)
{
if (PL == 1)
{
Console.WriteLine(A + " --> " + C);
}
else
{
Hanoi(PL - 1, A, C, B);
Console.WriteLine(A + " --> " + C);
Hanoi(PL - 1, B, A, C);

}
}

AMIBCT
سه شنبه 29 آذر 1390, 15:23 عصر
اگر الگوریتم هانوی رو بدانید ساده می‌شود

الگوریتم هانوی بر این اساس است که شما اگر دو حلقه داشته باشید می‌توانید به سادگی آن را جابجا کنید
در الگوریتم هانوی حلقه‌ی بالایی را یک حلقه به حساب می‌آوریم و می‌دانیم که اگر حلقه‌های زیرین درست جابجا شوند می‌توانیم این حلقه را جابجا کنیم

بنابراین در یک فراخوانی بازگشتی
هر بار حلقه‌ی اول را خودمان جابجا می‌کنیم
و انتقال حلقه‌های زیرین را دوباره به همین تابع واگذار می‌کنیم

به این صورت هر بار فراخوانی فقط یک حلقه را جابجا می‌کند( کاری که ساده است )
و کار سخت را ( انتقال حلقه‌های زیرین ) را به فراخوانی‌های بازگشتی می‌سپارد

در هر فراخوانی یک حلقه جابجا می‌شود
در نتیجه بعد از چند مرحله دیگر حلقه‌ای باقی نمی‌ماند

alireza2220
سه شنبه 29 آذر 1390, 15:57 عصر
میشه الگریتم را با نمایش خود حلقه ها و A,B,C توضیح بدین

AMIBCT
سه شنبه 29 آذر 1390, 21:47 عصر
این تابع تعداد PL حلقه رو از ستون A به ستون C انتقال می‌ده و از ستون B کمک می‌گیره

در بخش اول می‌بینید که اگر یک حلقه داشته باشیم دیگر نیازی به ستون B نیست و انتقال مستقیم صورت می‌گیره

در بخش دوم( وقتی که بیش از یک حلقه داریم )

PL - 1 حلقه رو در ستون موقتی می‌ریزیم(‌ چون تعدادش زیاد است و ما نمی‌توانیم این کار را مستقیم انجام بدیم با کمک فراخوانی بازگشتی این کار رو می‌کنیم )
دانه‌ی آخر را چون یکی است بلدیم جابجا کنیم
PL - 1 حلقه را که قبلا به ستون موقتی انتقال دادیم باز با کمک فراخوانی بازگشتی در خانه‌ی مقصد جابجا می‌کنیم

asadegha
سه شنبه 29 آذر 1390, 22:14 عصر
با سلام دوستان
من این الگوریتمو از بعد از else نمیفهمم سرچ هم کردم اما باز هم متوجه نشدم
من این مطلب رو کلی فهمیدم اما سر الگریتم مشکل دارم یعنی نمی فهمم چه جوری حل میشه
مرسی.

static void Hanoi(int PL, char A, char B, char C)
{
if (PL == 1)
{
Console.WriteLine(A + " --> " + C);
}
else
{
Hanoi(PL - 1, A, C, B);
Console.WriteLine(A + " --> " + C);
Hanoi(PL - 1, B, A, C);

}
}

سلام. این عکس روند کار رو برای 3 دیسک باز میکنه. سوال داشتی بپرس.

79473

alireza2220
سه شنبه 29 آذر 1390, 23:04 عصر
من جابه جا کردن جای متغییر ها رو متوجه میشم :افسرده:

AMIBCT
چهارشنبه 30 آذر 1390, 00:47 صبح
در توضیحاتی که نوشتم این موضوع هم هست

تابع ۴ تا پارامتر داره
پارامتر اول تعداد دیسک‌هایی که باید جابجا شود
پارامتر دوم مبدا
پارامتر سوم ستون کمکی
پارامتر چهارم مقصد

یعنی هر بار که تابع رو فراخوانی می‌کنیم بهش می‌گیم که تعداد PL حلقه را از ستون A با کمک ستون B در ستون C بریز
PL - 1 حلقه رو با کمک بازگشتی انجام می‌ده و یک حلقه که راحت است رو خودش جابجا می‌کنه

asadegha
جمعه 02 دی 1390, 04:20 صبح
خوب. اینو ببین. اگه بازم متوجه نشدی بگو کاملا باز بازش کنم.

79553

vahid javani
جمعه 17 شهریور 1391, 12:05 عصر
درود
تا حالا این برنامه رو با f10 جلو رفتید؟
خیلی آدمو گیج میکنه من که چیزی نفهمیدم اگه امکان داره راجعبش یه خورده توضیح بدید
ممنون

tooraj_azizi_1035
جمعه 17 شهریور 1391, 16:12 عصر
می خواهیم اگوریتم هانوی را بنویسیم:

مطمئن هستیم که باید n-1 حلقه بالایی در میله B قرار بگیرند تا بتوان حلقه n ام را در حلقه C قرار داد. با این فرض که این کار را کردیم باید بنویسیم:

Move From A to C

اما قبل از اینکه بتوانیم چنین کاری بکنیم باید n-1 حلقه در B قرار بگیرند پس قبل از کد بالا مینویسیم:

Hanoi(a,c,b,n-1);
Move From A to C

یعنی برای n-1 حلقه بالایی باید عمل Move From A to C اتفاق بیفتد جای b و c هم جا به جا نوشته شده چون مقصد b است!

حالا رسیده ایم به وضعیتی که حلقه nام در C قرار دارد و n-1 حلقه در B. خوب وقت آن است که n-1 حلقه را از B به C ببریم:


Hanoi(a,c,b,n-1);
Move From A to C
Hanoi(b,a,c,n-1);

در دستور Move From A to C مبدا هر پارامتری است که بعد از From قرار گرفته و مقصد هر پارامتری است که بعد از To قرار گرفته.

Was it clear?

vahid javani
جمعه 17 شهریور 1391, 18:03 عصر
درود دوست عزیز
ممنونم از راهنماییت من الگوریتمش رو کاملا یاد گرفتم(فکر می کنم که یاد گرفتم)
ولی موقع کامپایل کردن به مشکل بر می خورم.
کامپایلر میاد اونقدر تا خط 9 میاد تا اینکه pl یک بشه و شرط if درست بشه ولی بعدش رو نمی فهمم دوباره که میاد سر خط 9 چرا هر بار از خط 9 شروع میکنه "تا خط 10 میره"؟؟ و دوباره برای تابع خط 11 همین داستان.
کلا گیج شدم الگوریتمش خیلی راحت و قابل فهمه و مثل انشا می مونه ولی وقتی با f10 , f11 میرم جلو نمی فهمم داره چیکار میکنه.

یه چیزی الان از کتاب دیتل در مورد فیبوناچی دیدم این کار معنیش اینه که وقتی به اولین تابع بازگشتی میرسه به چندیدن تابع تقسیم میشه؟ ولی چرا از اول شروع نمی کنه؟
http://aplcenmp.apl.jhu.edu/Classes/Notes/Felikson/courses/605202/lectures/L3/Lec3BDwg3.jpg

tooraj_azizi_1035
جمعه 17 شهریور 1391, 19:51 عصر
برای فهمیدن هر الگوریتم بازگشتی تنها راه اینه که با استفاده از درخت اجرا رو Trace کنی. در برنامه هانوی هر بار که وارد برنامه میشی برنامه خودش رو دوباره صدا می زنه شما باید فراخونی جدید رو به شکل یک نود فرزند برای اجرا کنونی در نظر بگیری و همینطور بری جلو.