PDA

View Full Version : برجهای هانوی با 4 حلقه!



leilast
سه شنبه 06 آذر 1386, 15:31 عصر
سلامحتما همه مسئله برجهای هانوی رو میدونید؟اگر نمیدونید بگین تا توضیح بدم.میخواستم بدونم اگه در این مسئله به جای 3حلقه از 4 حلقه استفاده کنیم شکل کلی الگوریتم مسئله چه فرقی میکنه؟ممنونم.

emad_67
سه شنبه 06 آذر 1386, 16:24 عصر
منظورت 4 تا میله هست؟
تعداد حلقه ها هیچ تغییری در الگوریتم به وجود نمیاره. هر چند تا خواستی میتونی قرار بدی.

herfei
چهارشنبه 07 آذر 1386, 17:36 عصر
منظورت 4 تا میله هست؟
تعداد حلقه ها هیچ تغییری در الگوریتم به وجود نمیاره. هر چند تا خواستی میتونی قرار بدی.
سلام
راستش این سوال برای منم هست و هر چقدر هم که تلاش می کنم نمی تونم به روش بازگشتی اونو درک کنم میشه تریسش کنین(به روش باز گشتی)
ممنون می شم

emad_67
چهارشنبه 07 آذر 1386, 22:03 عصر
سلام
فکر میکنم بیشتر رو درک تابع بازگشتی باید مشکل داشته باشی چون اگه نحوه عمل تابع باز گشتی رو دقیقا فهمیده باشی، هانوی رو هم متوجه میشی. به هر حال اگه رو تابع های باز گشتی ایرادی داری بگو اول اونو توضیح بدم بعد خودت میتونی برنامه رو trace کنی.

herfei
پنج شنبه 08 آذر 1386, 13:39 عصر
سلام
فکر میکنم بیشتر رو درک تابع بازگشتی باید مشکل داشته باشی چون اگه نحوه عمل تابع باز گشتی رو دقیقا فهمیده باشی، هانوی رو هم متوجه میشی. به هر حال اگه رو تابع های باز گشتی ایرادی داری بگو اول اونو توضیح بدم بعد خودت میتونی برنامه رو trace کنی.
سلام بله دقیقا من توی تابع های بازگشتی مشکل دارم میشه اونو توضیح بدین ممنون
می شم

emad_67
پنج شنبه 08 آذر 1386, 15:45 عصر
برای تابع بازگشتی هه مثال ساده میزنم


#include<iostream.h>
void print(int n)
{
if(n>0)
print(n-1);

cout<<n<<endl;
}

void main()
{
print(10);
}
تابع print یک عدد میگیره و از 0 تا اون عدد رو به صورت باز گشتی چاپ میکنه.
در ابتدا که برنامه شروع میشه فرض کن عدد 1 به تابع فرستاده میشه و توسط شرط تابع print چک میشه و چون شرط برقرار است تابع print فراخوانی میشه در واقع در خطی که تابع print در اون قرار گرفته یک بار کل تابع باید از اون خط اجرا بشه( البته با عدد 0) و این در حالی هست که هنوز دستور cout برای اولین فراخوانی تابع اجرا نشده .
شکل برنامه تقریبا این جوری میشه


void print(int n)
{
if(n>0)
print(n-1);{
if(n>0)
print(n-1);

cout<<n<<endl;
}
cout<<n<<endl;
}
از جایی که print فراخوانی شده یه بلاک باز کردم و کل دستور های تابع رو در اون قرار دادم.
خوب وقتی که عدد میشه 0 دیگه شرط برقرار نیست و print فراخوانی نمیشه و حالا در ادامه برنامه باید cout ها اجرا شوند. یعنی خروجی میشه


0
1
توی اینجا عدد رو کوچیک مثال زدم که راحتر باشه ولی اگه عدد رو مثلا 10 بگیری به انداره 10 بار تابع print فراخوانی میشه و 10 تا cout اجرا نشده باقی میمونن. درواقع این دستورات در استک قرار میگیرن یعنی هر بار که تابع print فراخوانی میشه تمام وضعیت فعلی برنامه در استک قرار میگیره و وقتی که برنامه تموم شد از بالای استک دستورات فراخوانی میشن مثلا برای n=2 استک به این شکل میشه


cout<<1<<endl;
cout<<2<<endl;
اگه اینو فهمیده باشی هانوی هم به همین شکل انجام میشه که البته یه کم مراحلش طولانی و پیچیده تره که اگه تمام فراخوانی ها رو روی کاغذ بنویسی متوجه میشی که چه جوری کار میکنه.

leilast
سه شنبه 20 آذر 1386, 16:59 عصر
میبخشید دیر جواب دادم
منظورم همون 4 تا پایه(برج)بود.:لبخند:
میتونید کمکم کنید؟:لبخند:

emad_67
سه شنبه 20 آذر 1386, 17:58 عصر
میبخشید دیر جواب دادم
منظورم همون 4 تا پایه(برج)بود.:لبخند:
میتونید کمکم کنید؟:لبخند:بازم شکل کلی الگوریتم فرقی نمیکنه فقط از یه پایه تقریبا استفاده ای نمیشه. مگر اینکه شرط خاصی گذاشته بشه، وگرنه اگه بخوای مثل قانون کلی هانوی (یعنی اینکه حلقه ها از میله اول به آخر منتقل بشن و حلقه ها هم از بزرگ به کوچک روی هم قرار بگیرن) باهاش رفتار کنی هیچ فرقی در الگوریتم نمیکنه.

leilast
پنج شنبه 22 آذر 1386, 20:02 عصر
آره دیگه,منظورم همینه
یعنی کل جابجاییها با استفاده از 4 تا میله باشه و از همش هم استفاده بشه.

emad_67
پنج شنبه 22 آذر 1386, 20:45 عصر
یعنی هیچ شرطی نداره؟ اصلا برای چی میخوای اینکارو بکنی؟ فقط بی خودی یه کاری انجام میشه دیگه. ولی به هر حال این برنامه هم همون کار انتقال از میله اول به آخر رو انجام میده ولی با 4 تا میله و یه سری کارای بیخودی:


#include<iostream.h>
void hanoi(int n,int a,int b,int c,int d)
{
if(n==1)
cout<<a<<" -> "<<d<<endl;
else if(n>1)
{
hanoi(n-1,a,c,d,b);
hanoi(n-1,b,a,d,c);
cout<<a<<" -> "<<d<<endl;
hanoi(n-1,c,a,b,d);
}
}
void main()
{
int n;
cin>>n;
hanoi(n,1,2,3,4);
}

abdolla nazari
پنج شنبه 09 اردیبهشت 1389, 13:27 عصر
اگه میشه یکی از دوستان درباره ی برجهای هانوی با استفاده از مطالب دیتل تا فصل 6 نه بیشتر مرا کمک کند همچنین درباره ی چگونگی ایجاد شکل گرافیکی هم کلا مشکل دارم تشکر http://www.barnamenevis.org/forum/images/smilies/yahoo/127.gif