الگوریتمستان

یادداشت‌های یک معلم علاقه‌مند به نوشتن از آنچه آموخته و یاد می‌دهد
 

آنچه در این نوشته می‌خوانید:

علاقه‌مندان به مباحث مختلف طراحی الگوریتم و همینطور شرکت‌کنندگان مسابقات برنامه‌نویسی به خوبی می‌دانند که یکی از مهمترین پارامترهای طراحی موفقیت‌آمیز یک الگوریتم، شیوه صحیح فکر کردن روی حل مسئله است. حل انواع سوالات الگوریتمی به ما کمک می‌کند ذهن خودمان را برای حل مسائل پیچیده‌تر آماده کنیم.

مسئله برج هانوی (Tower of Hanoi) یکی از مسائل تاریخی مشهور است که در مباحث طراحی الگوریتم نیز به آن پرداخته می‌شود.

به شکل زیر توجه کنید:

  

برج هانوی

  

سه میله - میله مبدأ (A) ، میله کمکی (B) و میله مقصد (C) - و تعدادی دیسک در میله مبدأ داریم. هدف انتقال تمام دیسک‌ها از این میله به میله مقصد با رعایت دو شرط زیر است:

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

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

به عنوان مثال، اگر $ n = 2 $ باشد:

  

برج هانوی

  

1) دیسک 1 را به میله B منتقل می‌کنیم $ (A \rightarrow B) $:

  

برج هانوی

  

2) دیسک 2 را به میله C منتقل می‌کنیم $(A \rightarrow C)$:

  

برج هانوی

  

3) دیسک 1 را به میله C منتقل می‌کنیم $(B \rightarrow C)$:

  

برج هانوی

  

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

  

حل بازگشتی مسئله برج هانوی

  [برگرد بالا]

برای اینکه بتوان از روش بازگشتی تقسیم و حل (یا تقسیم و غلبه - Divide and Conquer) برای حل یک مسئله استفاده نمود، مسئله باید قابلیت خرد شدن به زیرمسئله‌هایی از همان نوع مسئله اصلی و اندازه کوچکتر را داشته باشد. این ویژگی در مورد مسئله برج هانوی صدق می‌کند.

ایده اصلی از آنجا ناشی می‌شود که برای جابجا کردن بزرگترین دیسک از میله A به میله C، ابتدا باید تمامی دیسک‌های کوچکتر به میله B منتقل شوند. پس از تمام شدن این مرحله، دیسک بزرگ را از میله A به میله C منتقل کرده و مجددا به کمک میله A تمامی دیسک‌های میله B را به میله C منتقل می‌کنیم. پس به طور خلاصه می‌توان گفت:

مرحله یک: $n - 1$ دیسک بالایی میله مبدأ با شرایط ذکر شده و به کمک میله C به میله B منتقل می‌شوند.

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

مرحله سه: $n - 1$ دیسک میله B با کمک گرفتن از میله A به میله مقصد منتقل می‌شوند.

می‌بینیم که توانستیم عملیات جابجا کردن $n$ دیسک را به دو عملیات مشابه ولی با اندازه کمتر و یک عملیات ساده تقسیم کنیم.

تابع بازگشتی زیر به زبان ++C ترتیب حرکت‌ها را چاپ می‌کند:

  

void hanoi(int nDisk, char start, char temp, char finish){

  if(nDisk == 1)

    cout << start << " -> " << finish << endl;

  else{

    hanoi(nDisk - 1, start, finish, temp);

    cout << start << " -> " << finish << endl;

    hanoi(nDisk - 1, temp, start, finish);

  }

}

  

برای مثال، فراخوانی تابع به صورت ('hanoi(3, ‘A’, ‘B’, ‘C، مسئله برج هانوی را با سه دیسک که در میله A قرار دارند و با کمک میله B به میله C منتقل خواهند شد، حل می‌کند.

واضح است که تابع بازگشتی فوق کمترین تعداد حرکت را چاپ می‌کند. چرا که برای جابجا کردن بزرگترین دیسک از پایین میله A، بقیه دیسک‌ها باید در میله B باشند. فقط در این صورت این دیسک جابجا می‌شود. در فراخوانی‌های بعدی، دیسک دوم از نظر بزرگی جابجا می‌شود و الی آخر. پس در این فراخوانی‌ها جابجایی بیهوده‌ای صورت نمی‌گیرد. نیز توالی حرکت‌ها برای هر $n$ منحصر بفرد است. یعنی برای یک $n$ مشخص، دو توالی متمایز از جابجایی‌ها وجود ندارد که تعداد جابجایی آنها کمتر یا مساوی این حالت باشد.

  

تحلیل پیچیدگی زمانی مسئله برج هانوی

  [برگرد بالا]

در حالت کلی می‌خواهیم بدانیم اگر تعداد دیسک‌ها $n$ باشد، کمترین تعداد حرکت برای جابجا نمودن دیسک‌ها چقدر است؟

فرض کنید $ T(n) $ تعداد حرکت‌های لازم جهت انتقال $n$ دیسک به مقصد باشد. بر اساس توضیحات فوق، تعداد $T(n - 1)$ حرکت برای انتقال $n - 1$ دیسک به میله کمکی، یک حرکت برای انتقال بزرگترین دیسک به میله مقصد و مجددا $ T(n - 1) $ حرکت برای انتقال $n - 1$ دیسک موجود در میله کمکی به میله مقصد نیاز است. پس:

  

\[T(n) = 2 T(n - 1) + 1 \]

  

با حل این رابطه بازگشتی به روش‌های ریاضی، به نتیجه زیر می‌رسیم:

  

\[T(n) = 2^n  - 1 \]

  

مرتبه اجرایی این الگوریتم $ O(2^n) $ است که چندان مرتبه مطلوبی به نظر نمی‌رسد. اما همانگونه که بحث شد، این روش حداقل تعداد حرکت‌های ممکن را می‌دهد؛ و هرگز نمی‌توان روش دیگری با مرتبه پایین‌تر برای حل آن یافت.

  

حل غیربازگشتی مسئله برج هانوی

  [برگرد بالا]

مسئله برج هانوی علاوه بر روش تابع بازگشتی، راه حل‌های غیربازگشتی نیز دارد. تا به اینجا مشخص شده است که بهترین راه حل برای جابجا کردن $n$ دیسک، به تعداد نمایی حرکت نیاز دارد. در نتیجه مرتبه راه حل‌های آن در بهینه‌ترین حالت - چه بازگشتی و چه غیربازگشتی - از مرتبه $ 2 ^n $ خواهد بود. اما آنچه که راه حل بازگشتی و غیربازگشتی را از هم متمایز می‌کند، مرتبه فضای مصرفی آن است.

حل بازگشتی مسئله، فراخوانی‌های تو در تو و فضای پشته از مرتبه $ O(n) $ نیاز دارد. در حالی که می‌توان با استفاده از روش غیربازگشتی این مرتبه را به $ O(1) $ کاهش داد. البته این مسئله تنها دلیل بررسی روش غیربازگشتی نیست. تبدیل مرتبه مصرف فضا از $ O(n) $ به $ O(1) $ زمانی که مرتبه اجرای الگورینم $ O(2 ^ n) $ است، چندان قابل توجه نیست. دلیل دیگر می‌تواند این باشد که برخی زبان‌های برنامه‌نویسی از فراخوانی بازگشتی توابع پشتیبانی نمی‌کنند و مجبور به استفاده ار روشهای غیربازگشتی هستند. اما دلیل اصلی این است که با بررسی این روش‌ها، تمرین کوچکی برای تبدیل الگوریتم‌های بازگشتی به غیربازگشتی انجام می‌دهیم.

تا کنون چندین روش مختلف جهت پیاده‌سازی غیربازگشتی حل مسئله برج هانوی ارائه شده است که در اینجا دو روش معرفی می‌شود. توجه داشته باشید که همه جزئیات حل مسئله به صورت دقیق و مشروح مطرح نمی‌شود و استدلال قسمتی از نتیجه‌گیری‌ها به عنوان تمرین به خواننده واگذار می‌گردد.

روش اول- حل مسئله برج هانوی را می‌توان معادل پاسخ دادن به این سوال دانست که: در هر مرحله کدام دیسک به کدام میله منتقل می‌شود؟

سوال اول: کدام دیسک؟ فرض کنیم دیسک‌هایی به شعاع $y$، $x$ و $z$ که رابطه $ x < y < z $ را با هم دارند، کوچکترین دیسک هر میله باشند. به عبارت دیگر، این سه دیسک بالاترین دیسک‌های میله‌ها هستند که قابلیت جابجایی دارند. اگر میله‌ای شامل هیچ دیسکی نباشد، دیسکی با شعاع بی‌نهایت را برای آن در نظر می‌گیریم. حال به استدلال‌های منطقی زیر توجه کنید:

استدلال شماره 1) $x$ برابر 1 است. چرا که بر اساس قوانین حاکم بر مسئله، هیچ دیسکی نمی‌تواند روی دیسک 1 قرار بگیرد. در نتیجه این دیسک همیشه بالاترین دیسک موجود در یکی از میله‌ها است.

استدلال شماره 2) در آغاز همه دیسک‌ها روی یک میله قرار دارند که دیسک 1 بالاترین دیسک آن است. پس در اولین مرحله دیسک 1 جابجا می‌شود.

استدلال شماره 3) دیسک‌هایی که طی دو مرحله متوالی جابجا می‌شوند حتما متمایز هستند. این مسئله از بهینه بودن راه حل ناشی می‌شود. اگر قرار باشد طی دو مرحله متوالی یک دیسک خاص را جابجا کنیم، می‌توانیم دو مرحله را با هم ادغام کرده و کل جابجایی را یکجا انجام دهیم.

استدلال شماره 4) با توجه به قوانین حاکم بر مسئله، دیسک $z$ نمی‌تواند حرکت کند. چرا که دیسک‌های $x$ و $y$ هر دو از آن کوچکتر هستند.

استدلال شماره 2 می‌گوید که اولین حرکت همیشه با دیسک 1 است. استدلال شماره 3 می‌گوید حرکت بعدی با دیسکی غیر از دیسک 1 است. استدلال شماره 4 می‌گوید این دیسک نمی‌تواند بزرگترین دیسک موجود در بالای میله‌ها باشد. پس در مرحله بعدی دیسک $y$ جابجا خواهد شد. و بالاخره حرکت بعدی باز هم با دیسک 1 است (چرا؟).

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

سوال دوم: کدام میله؟ حال که می‌دانیم در هر مرحله کدام دیسک جابجا می‌شود، به سراغ میله مقصد می‌رویم. در مراحل زوج که دیسک $y$ منتقل خواهد شد، تشخیص میله مقصد بسیار آسان است. چرا که روی یکی از میله‌ها دیسک 1 قرار دارد که دیسک $y$ نمی‌تواند روی آن قرار بگیرد. در نتیجه به تنها میله باقیمانده (میله دیسک $z$) منتقل می‌شود. در مورد مراحلی هم که دیسک 1 قرار است جابجا شود، می‌توان اینطور استدلال کرد:

فرض کنیم دیسک 1 روی میله A قرار داشته باشد و آن را به میله C منتقل کنیم. در مرحله بعدی دیسک y جابجا می‌شود. و در مرحله بعد باز هم دیسک 1 باید جابجا شود. حال اگر این دیسک را به میله A بازگردانیم، به نوعی کار اضافی و بازگشت به عقب انجام داده‌ایم. برای آشکار شدن این موضوع کافی است مسئله برج هانوی را با دو دیسک حل کنید و در حرکت دوم دیسک 1، آن را به میله‌ای بازگردانید که از آن آمده بود. پس می‌توان گفت: در حرکت‌های متوالی، دیسک شماره 1 به میله‌ای حرکت می‌کند که از آن به میله فعلی خود نیامده است. این مسئله نه تنها در مورد دیسک 1 که در مورد همه دیسک‌ها صادق است. یعنی همه دیسک‌ها در حرکت‌های خود به سمت میله‌ای می‌روند که در حرکت قبلی خود از آن نیامده‌اند. اما لحاظ کردن این شرط برای این دیسک‌ها لازم نیست. چرا که در هر مرحله، تنها یک انتخاب برای حرکت خود دارند.

تنها مسئله باقیمانده، میله مقصد دیسک 1 در اولین حرکت خود است. زمانی که این دیسک اولین حرکت خود را انجام می‌دهد، نمی‌توان از استدلال فوق برای تشخیص میله مقصد استفاده کرد (چرا؟). استدلال این قسمت را هم که چندان دشوار نیست به شما وا می‌گذارم و تنها به بیان نتیجه می‌پردازم: اگر تعداد دیسک‌ها زوج باشد، دیسک 1 را در اولین حرکت به میله کمکی (یعنی میله B) و در غیر اینصورت به میله مقصد (یعنی میله C) منتقل می‌کنیم.

به این ترتیب حل مسئله برج هانوی به صورت غیربازگشتی پیاده‌سازی می‌شود. حال می‌دانیم که در هر مرحله کدام دیسک به کدام میله منتقل می‌شود.

روش دوم: یکی دیگر از روش‌های پیاده‌سازی غیربازگشتی حل مسئله برج هانوی که در یک منبع اینترنتی مشاهده کردم، از الگوریتم زیر تبعیت می‌کند:

  

void hanoi(int nDisk, char start, char temp, char finish){

  int max = nDisk;

  char dest = finish;

  int disk = max;

  while(true){

    while(disk > 0){

      if(moving disk succeeds)

      {

        if(disk == max){

          max--;

          if(max == 0)

            return;

        }

        dest = the final place of max;

      }

      else

        dest = the alternative place between dest and the current place of disk;

      disk--;

    }

    p and q = the places different of dest;

    disk = the smaller of the disks on top of p and q;

    dest = the place between p and q with greater disk on top;

  }

}

  

تشریح عملکرد این الگوریتم یک تمرین خوب است. توضیح اینکه این الگوریتم بر خلاف الگوریتم قبلی که سعی در یافتن قوانین حرکت دیسک‌ها داشت، دقیقا همان روش بازگشتی را شبیه‌سازی می‌کند.

در پایان توجه داشته باشید که دو روش ذکر شده، تنها روشهای پیاده‌سازی غیربازگشتی حل مسئله نیستند.

مسعود اقدسی فام

مسعود اقدسی فام هستم.

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

algs.ir/spvjt3a     اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram
نوشته‌ها از این دست
       ✦   مسئله Column Addition
آخرین نوشته‌ها
       ✦   الگوریتم آنلاین
نوشته‌های پرمخاطب
       ✦   مسئله کاشیکاری
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

پست الکترونیک (محرمانه):

متن پیام: *  

01 02 06 07 08 09 10 11 12 13 14

• آرزو
جمعه، ۴ مرداد ماه ۱۳۸۷، ساعت ۱۱:۱۰

سلام

خسته نباشید

ای کاش یه جوری بازی آنلاینشم می ذاشتین تا کاربرا بتوننن همینجا بازی کنن

اینجوری درک بازی هم بهتر بود هم برنامه نویسیشو ساده تر می کرد...........

• زهرا
سه‌شنبه، ۲۲ مرداد ماه ۱۳۸۷، ساعت ۲۱:۳۶

سلام   دست شما درد نکنه فقط می خواستم سوال کنم پس قسمت mainبرنامه چی میشه؟

• نادر ریحانی‌پور باسمنج
چهارشنبه، ۲۳ مرداد ماه ۱۳۸۷، ساعت ۱۳:۰۸

زهرا خانم سلام

خودتون یه main بنویسد و داخل main مثلا بنویسید ( 'hanoi( n, ‘A’, ‘B’, ‘C

n رو هم از ورودی بخونید.

هدف این مطلب فقط آشنایی با مساله هانوی بود.

• راحله جهانی
سه‌شنبه، ۵ شهریور ماه ۱۳۸۷، ساعت ۲۰:۴۳

سلام خیلی خوب بود اما حل مساله به چه دردی می خوره

• نادر ریحانی‌پور باسمنج
چهارشنبه، ۶ شهریور ماه ۱۳۸۷، ساعت ۲۳:۰۶

خانم جهانی

برای این که یک برنامه نویس تازه کار بتونه در کارش پیشرفت کنه باید بر تکنیک های زیادی مسلط شود، یکی از این تکنیک ها که خیلی مهم و اساسی هست، تکنیک بازگشته و سوال برج های هانوی یک مثال خیلی خوب برای شرح این روشه.

البته این سوال فقط به این محدود نمی شود و خیلی ویژگی های زیادی دارد که مجال بحث در این جا نیست.

  چه خوش گفت پیغمبر راستگوی      زگهواره تا گور دانش بجوی

• فاطمه
چهارشنبه، ۱۳ شهریور ماه ۱۳۸۷، ساعت ۱۱:۵۴

سلام

خوبین؟

هنوز متنو نخوندم ولی مطمئنم که جالبه مخصوصا واسه من که عشق هانوی هستم نیست به استعداد خودم در هانوی هم در کنفرانی یزد پی بردم:دی

ولی کار خوبی نکردین وبلاگتونو حذف کردین

جالب بود!!!

• علی معیل
چهارشنبه، ۳ مهر ماه ۱۳۸۷، ساعت ۱۵:۱۰

با سلام

من دانشجوی کامپیوتر می باشم

اگر جزوه ای در مورد طراحی الگوریتم دارید برایم ارسال کنید

با تشکر

• sanaz
جمعه، ۵ مهر ماه ۱۳۸۷، ساعت ۲۲:۳۹

salam man daneshjuye computer hastam agar hale tamrinate ketabe CLRS ra barayam befrestid mamnun mibasham

• ساناز
جمعه، ۵ مهر ماه ۱۳۸۷، ساعت ۲۲:۴۵

سلام من دانشجوی کامپیوتر هستم لطفا جواب تمرینات کتاب CLRS را برایم بفرستید

• الهه یزدانی
شنبه، ۶ مهر ماه ۱۳۸۷، ساعت ۱۴:۳۹

من دانشجوی برق هستم اگه براتون ممکنه جزوه ای در مورد الگوریتم و فلوچارت برام بفرستید

• فاطمه
چهارشنبه، ۱۷ مهر ماه ۱۳۸۷، ساعت ۱۸:۲۹

سلام. من نمودار زمان اجراي برج هانوي رو مي خواستم . خيلي فوريه! شنبه بايد تحويل بدم. ميشه لطفا واسم بفرستين؟

پيشاپيش ممنون

• آرمیتا حیدری
جمعه، ۱۹ مهر ماه ۱۳۸۷، ساعت ۱۷:۴۳

با سلام خسته نباشید

در مورد الگوریتم on lineو off line توضیحاتی لطفا قید فرمایید

• عسل
یکشنبه، ۲۱ مهر ماه ۱۳۸۷، ساعت ۲۲:۴۸

سلام

خسته نباشید

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

• سجاد چلداوی
سه‌شنبه، ۳۰ مهر ماه ۱۳۸۷، ساعت ۰۹:۰۷

با تشکر

• ساهره
دوشنبه، ۶ آبان ماه ۱۳۸۷، ساعت ۲۲:۱۷

با سلام

احتراماً خواهمشند است کتاب یا سایتی را که در مورد طراحی الگوریتم، فلوچارت و پاسکال که با پاسخ تشریحی باشد را برایم معرفی کنید

با تجدید احترام

• امین
یکشنبه، ۱۲ آبان ماه ۱۳۸۷، ساعت ۱۸:۴۹

Thanks

• مسعود
شنبه، ۱۸ آبان ماه ۱۳۸۷، ساعت ۲۱:۰۸

سلام

من دانشجوی ترم 5 نرم افزار هستم می خواهم در دانشگاه گروه نرم افزاری تخصصی درست کنم می تونید یک سری وظایف را به ما نشان دهید تا ما با تجربه شما این کار را انجام دهیم مثلا اول یک نفر مدیر - کد نویس ها

در کجا یک پروژه قرار میگیرند.

و از وبلاگ من دیدن کنید

• محمد
چهارشنبه، ۲۲ آبان ماه ۱۳۸۷، ساعت ۱۸:۱۱

برج هانوی به صورت بازگشتی و گرافیکی  ممنون

• علی
شنبه، ۲۵ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۱

سلام لطفا" در صورت امکان حل تمرینات طراحی الگوریتم جعفرنژاد قمی را برایم بفرستید. یا وب سایتی را معرفی کنیدو ممنون

• سوریاس
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۰

سلام

یک الگوریتم(n lgn )بنویسید که باقی مانده تقسیم x به توان n بر p را محاسبه کند فرض کنید که n توانی از 2 است.الگوریتم را به زبان سی پلاس پلاس بنویسید

• محمود
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۱

نامه ای بنویسید که بزرگترین عدد موجود در لیست (ارایه ) ازn عدد را بیابد.

• محمود
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۲

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

• شیوا
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۳

برنامه ای بنویسید که هم بزرگترین و هم کوچکترین عدد موجود در لیست (ارایه ) ازn عدد را بیابد روشی بیابید که حداکثر حدود 1.5 مقایسه روی عناصر ارایه انجام شود

• رضا
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۵

یک الگوریتم خطی زمانی بنویسید که n عدد متمایز را مرتب کند. یک ارایه 500 عنصری به کار ببرید

• ارس
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۶

برنامه ای بنویسید که لیستی مرکب از n عدد صحیح مثبت را به دو لیست کوچکتر افراز کند که اندازه هر یک n/2 باشد به قسمی که اختلاف میان حاصل جمع اعداد صحیح موجود در دو لیست کوچکتر حداقل باسد . پیچیدگی زمانی الگوریتم را هم تعین کنید .فرض کنید که n مضربی از 2 باشد

• نیما
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۷

استفاده از روش تقسیم و حل یک برنامه ای بازگشتی بنویسید که بیشترین مجموع را در هر زیر لیست از لیستی به طول n عدد حقیقی بیابد

• کیوان
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۸

برنامه ای بنویسید که لیستی از n عنصر را با تقسیم ان به سه لیست فرعی هر یک با حدود n/3 عضو .مرتب سازی هر یک از لیست های فرعی به صورت بازگشتی و ادغام لیست ها ی فرعی مرتب کند. الگوریتم را تحلیل کنید و نتایج را با استفاده از نماد مرتبه نسان دهید

• سارا
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۴۹

یک برنامه تقسیم وحل برای برج هانوی بنویسید

• میلاد
دوشنبه، ۲۷ آبان ماه ۱۳۸۷، ساعت ۰۹:۵۲

یک الگوریتم تقسیم وحل برای n فاکتوریل بنویسید. مررررررررررررررررررسی

• يگانه
چهارشنبه، ۲۹ آبان ماه ۱۳۸۷، ساعت ۱۶:۵۷

سلام ممنونم از بابت نوشتن برنامه ولي من مشكلم تو برنامه همون قسمت int main بود كه شما اشاره نكردين اگه زحمتي نيست اونم بگين

• مینا
پنجشنبه، ۳۰ آبان ماه ۱۳۸۷، ساعت ۰۸:۵۳

salam

man be jozve  gerafek computery ya ketabe on neyaz daram be zabane c

  misham    age betoned komak koned

mamnoon

• فرناز80
یکشنبه، ۳ آذر ماه ۱۳۸۷، ساعت ۲۰:۱۳

1)به روش تقسيم وحل الگوريتمي مناسب براي ضرب اعداد صحيح بزرگ طراحي و پيچيدگي ان را بيابيد.ممنون ميشم.

• mohammad
دوشنبه، ۴ آذر ماه ۱۳۸۷، ساعت ۱۰:۵۵

borje hanoy be sorat bazgashti dar vb mikhastam                    <  -----.salam

• amin
سه‌شنبه، ۵ آذر ماه ۱۳۸۷، ساعت ۲۲:۲۶

برنامه ای بنویسید که بزرگترین عدد موجود در لیست (ارایه ) ازn عدد را بیابد.

یک الگوریتم(n lgn )بنویسید که باقی مانده تقسیم x به توان n بر p را محاسبه کند فرض کنید که n توانی از 2 است.الگوریتم را به زبان سی پلاس پلاس بنویسید

• علی
پنجشنبه، ۱۴ آذر ماه ۱۳۸۷، ساعت ۲۲:۴۰

عالی بود.لطفا درباره منطق فازی یک مطلب خوب بگذارید.

• سحر
شنبه، ۳۰ آذر ماه ۱۳۸۷، ساعت ۱۴:۴۶

سلام

بابت برنامه هاتون ممنون

• Ali
پنجشنبه، ۵ دی ماه ۱۳۸۷، ساعت ۰۷:۴۰

سلام میشه لطف کنید و این برنامه رو ساده و بدون تابع بازگشتی بنویسید

• جعفر اذرمی
شنبه، ۵ بهمن ماه ۱۳۸۷، ساعت ۱۶:۲۷

سلام.

لطفاَ منبعی برای ++C برای من ایمیل کنید.ممنون از تلاشتان

• taranom
چهارشنبه، ۹ بهمن ماه ۱۳۸۷، ساعت ۲۳:۲۲

سلام من تازه با این سایت آشنا شدم،نمیشه هر چند وقت یه بار یه تکلیف برنامه نویسی بدین یا یه چنین سایتی بهم معرفی کنین ممنونم

مسعود اقدسی فام
چهارشنبه، ۹ بهمن ماه ۱۳۸۷، ساعت ۲۳:۳۹

سلام ترنم خانم

منظورتون از تکلیف برنامه نویسی چیه؟ سوالات الگورتیمی؟ یا تکالیفی که کمک می کنه درسهای دانشگاهی رو بهتر متوجه بشید؟

• taranom
پنجشنبه، ۱۰ بهمن ماه ۱۳۸۷، ساعت ۱۱:۱۸

سلام خسته نباشید

آره منظورم تمرین هایی بود که به یادگیری دروس دانشگاهی کمک می کنه.خصوصا دروس ساختمان داده و طراحی الگوریتم البته اگه امکانش هست.

• مهدی
سه‌شنبه، ۲۹ بهمن ماه ۱۳۸۷، ساعت ۱۳:۱۱

سلام.

من خیلی وقته میخوام ماکزیمم تطابق یا همون maximum matching رو یار بگیرم اما اکثر منابع انگلیسیه و من اصلا نمیفهمم که چی کار میکنن.

میشه شما یه راهنمایی بکنی و یه مطلب در این مورد تو سایت بذاری؟؟؟

• رضا(سحر)
چهارشنبه، ۱۴ اسفند ماه ۱۳۸۷، ساعت ۲۳:۲۸

ممنونم از همتون با(عشق به سحر)

• زري
یکشنبه، ۱۸ اسفند ماه ۱۳۸۷، ساعت ۱۷:۴۸

سلام.با تشكر از خدمت علمي شما عزيزان.من توضيحي ساده و مفهومي از تعريف دقيق مرتبه ي اجرايي ميخواستم . تعريفي كه در كتاب اقاي مقسمي در فصل 2 آمده من اصلا متوجه نمي شوم .تعريف امگا و تتا و مرتبه اجرايي الگوريتم هاي بازگشتي را نمي فهمم.اگر امكان دارد اين مطالب را به زبان ساده در سايت قرار بدهيد.بسيار ممنون ميشوم.

مسعود اقدسی فام
سه‌شنبه، ۲۰ اسفند ماه ۱۳۸۷، ساعت ۰۰:۲۹

سلام

مهدی جان،

متاسفانه در این مورد اطلاعات چندانی ندارم.

زری خانم،

در برنامه های آتی ما ارائه چنین مطالبی هم قرار دارن. امیدوارم بتونیم کمکی در این مورد بکنیم.

• fatme
جمعه، ۲۳ اسفند ماه ۱۳۸۷، ساعت ۱۷:۳۰

salam khaste nabashjd

man algorrtm gheir bazgashti  hanoj ro mikhastam

va sol digaram ene ke en algoritm ba 4 mile be sorat bazgashti mikhastami

mamnon misham javabamo bedid

• darya
یکشنبه، ۱۶ فروردین ماه ۱۳۸۸، ساعت ۱۱:۵۳

سلام جناب اقاي اقدسي   لطف بفرماييد در مورد متغير هاي روش دوم برج هانوي توضيح بفرماييد(هر متغير نشان از چيست؟)

مسعود اقدسی فام
دوشنبه، ۱۷ فروردین ماه ۱۳۸۸، ساعت ۲۱:۵۱

سلام دریا خانم

برای درک بهتر این روش بهتره یک بار خودتون کد رو خط به خط روی کاغذ اجرا کنید و روند تغییر مقدار متغیرها رو ببینید. اینطوری بهتر متوجه عملکردشون می شید. من خودم هم از این روش استفاده کردم.

• میترا
سه‌شنبه، ۲۵ فروردین ماه ۱۳۸۸، ساعت ۱۱:۴۰

سلام  خسته نباشید با دیدن این سایت خیلی خوشحال شدم دستتون درد نکنه بخاطر این ایده بسیار خوبتون

من سوالات زیادی در این زمینه ها دارم که بعضی از آنها را دوستان مطرح کردن که سوال من هم هست ممنون میشم جواب بدید.

• hajar
یکشنبه، ۳۰ فروردین ماه ۱۳۸۸، ساعت ۱۴:۵۰

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

• اسماعیل
چهارشنبه، ۲ اردیبهشت ماه ۱۳۸۸، ساعت ۱۴:۱۳

با تشکر  جواب تمرین های  کتاب طراحی الگوریتم قمی رو از کجا میتوانم بگیرم

• sohrab
دوشنبه، ۱۴ اردیبهشت ماه ۱۳۸۸، ساعت ۰۹:۴۳

با سلام اگه ميشه برنامه اي بنويسيد كه تمام اعداد 4رقمي كه دو رقم وسط انها با هم برابر است را چاپ كند

و برنامه اي بنويسيد كه اعداد فيگوناچي كمتر از 100را چاپ كند

• مهرداد
دوشنبه، ۱۴ اردیبهشت ماه ۱۳۸۸، ساعت ۱۰:۴۵

با سلام

          من دانشجوی کامپیوتر  هستم.اگه ممکنه منو  در حل  مساله برج هانوی برای n میله کمکی راهنمایی کنید.(به روش بازگشتی)  

                                                                                                                              با تشکر

• مهرداد
دوشنبه، ۱۴ اردیبهشت ماه ۱۳۸۸، ساعت ۱۰:۵۳

با سلام

ممکنه در  حل مساله برج هانوی با n میله کمکی راهنمایی  کنید

• N-R
چهارشنبه، ۱۶ اردیبهشت ماه ۱۳۸۸، ساعت ۰۰:۰۱

اگه می شه کد برنامه ی غیر بازگشتی برج هانوی رو تو زبان سی بذارین.

• aa
چهارشنبه، ۲۸ مهر ماه ۱۳۸۹، ساعت ۱۱:۵۲

منبع: ويكي پديا

چهارشنبه، ۲۸ مهر ماه ۱۳۸۹، ساعت ۱۴:۰۸
• مسعود اقدسی فام

دوست خوبم،

تمامی مطالب این وب‌سایت نوشته‌های خود من هستن.

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

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

باز هم ممنون از توجهت.

• امید
جمعه، ۱۲ آذر ماه ۱۳۸۹، ساعت ۱۷:۲۶

استفاده کردیم

مرسی

• shokouh
دوشنبه، ۲۲ فروردین ماه ۱۳۹۰، ساعت ۲۱:۳۴

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

• شادی
شنبه، ۲۳ مهر ماه ۱۳۹۰، ساعت ۱۳:۵۷

خوب بود ممنون12

• کیارش
سه‌شنبه، ۲۶ مهر ماه ۱۳۹۰، ساعت ۱۶:۰۸

سلام دوست عزیز من دانشجوی دانشگاه زنجانم استاد ما یه تمرین خواسته که الگوریتم بازگشتی مسئله برج هانوی راکه اجازه ی انتقال مستقیم دیسک از میله مبدا به میله مقصد وجود نداشته باشد را بنویسید. از کجا میشه یه کمکی بگیرم؟ تا فردا ظهر وقت دارم وگرنه به اضای هر 1 جلسه دیر کرد 40 درصد نمره مربوطه رو  از دست میدم

• masoud
جمعه، ۴ آذر ماه ۱۳۹۰، ساعت ۱۱:۴۹

با سلام.

من الگوریتم برج هانویی رو میخوام که با 3 دیسک باشد و هر 3 میله ارزش مساویی دارند.به عنوان مثال توی هر میله 3 تا دیسک یک نو است میخواهیم این 3 میله به هم تغییر کنند

• شقایق
سه‌شنبه، ۱۵ آذر ماه ۱۳۹۰، ساعت ۱۹:۳۶

خیلی عالی بود.مدت ها بود از اینکه توی سایتی میچرخم لذت نبرده بودم.موفق باشید

• ناشناس
سه‌شنبه، ۲۹ آذر ماه ۱۳۹۰، ساعت ۲۳:۴۹

سلام واقعا ممنون

خیلی بدردم خورد04

• Arm!n
جمعه، ۲۶ خرداد ماه ۱۳۹۱، ساعت ۱۰:۲۸

سلام

ممنون عالی بود...

• عسل
سه‌شنبه، ۳۰ خرداد ماه ۱۳۹۱، ساعت ۱۱:۱۸

سلام،مرسی خیلی خوب بود01

• ms ghozat
دوشنبه، ۶ آذر ماه ۱۳۹۱، ساعت ۱۸:۴۷

برنامه به زبان پاسکال برای جابجایی 13 مهره برج هانوی18

• ms ghozat
دوشنبه، ۶ آذر ماه ۱۳۹۱، ساعت ۱۸:۴۷

برنامه به زبان پاسکال برای جابجایی 13 مهره برج هانوی18

• یه غریبه‌ی دوست داشتنی
پنجشنبه، ۵ بهمن ماه ۱۳۹۱، ساعت ۱۲:۰۰

واقعا عالیه

استاد ما باید بیاد از شما یاد بگیره

چقدر سهل و روشن توضیح دادید

دستتون رو باید بوسید

• مریم
پنجشنبه، ۲۶ بهمن ماه ۱۳۹۱، ساعت ۱۹:۴۸

مرثی08

• امیر
شنبه، ۱۹ اسفند ماه ۱۳۹۱، ساعت ۲۱:۵۷

12

خیلی خوب بود

• راضیه
چهارشنبه، ۱ خرداد ماه ۱۳۹۲، ساعت ۱۱:۵۱

سلام. ممنون از راهنماییهای خوبتون. میخواستم بپرسم شما میتونید الگوریتم بازگشتی هانوی رو به صورتهای زیر تغییر بدین و با شبه کد اینجا بذارید؟؟؟؟ من خیلی بهش احتیاج دارم. شنبه هم امتحان پایان ترم دارم. اگه این لطف رو کنید ممنون میشم

1- الگوریتم برج هانوی رو طوری تغییر بدید که از هر دیسک 2عدد موجود باشد (راهنمایی: یعنی در برج c 2تادیسک n روی هم، بعد 2تا دیسک n-1 و همینطور تا دوتا دیسک 1 روی هم باشند.

2- الگوریتم برج هانوی را طوری تغییر بدید که از هر دیسک به تعداد شماره آن موجود باشد. ( یعنی njh از دیسک شماره n روی هم باشن بعدش n-1jh از دیسک شماره n-1 روی هم باشن تا الی آخر که 2تا از دیسک 2 و یکی از دیسک 1 باشد)

3- روی برج A از 1 تا n دیسک زوج داریم و روی برج B همین تعداد دیسک فرد داریم. الگوریتم برج هانوی را طوری تغییر بدید که در برج C جفت جفت دیسکها روی هم قرار بگیرند. ( مثلا دوتا nها روی هم، بعد دوتا n-1ها و الی آخر)

پیشاپیش از لطفتون ممنون

• محمدرضا
چهارشنبه، ۲۵ دی ماه ۱۳۹۲، ساعت ۱۴:۳۰

من 15 سالمه معلمه فیزیکمون خواسته در مورد الگوریتمش تحقیق کنیم و درباش بفهمیم ولی مطالبش اانقدررررر سنگیننههه ک من هیچی درک نمیکنم اصن نمیدونم n-1  یعنی چی(t) یعنی چی ولی ممنون از ااینکه گذاشتید ولی کاش مطالبش سبک تر بود که ما هم یه چیزی بفهمیم08

• رویا
شنبه، ۲۴ بهمن ماه ۱۳۹۴، ساعت ۱۲:۱۹

سلام

مطالبتون خیلی خوب بود

سپااااااس فراوان06

• مهسا
شنبه، ۲۴ مهر ماه ۱۳۹۵، ساعت ۲۱:۱۱

سلام ممنون عالی بود

• marjan
پنجشنبه، ۱ تیر ماه ۱۳۹۶، ساعت ۱۷:۱۰

میتونید الگوریتم هانوی رو طوری بنویسید که فقط بشه با میله ی مجاورش جابجایی داشته باشه؟؟

• حمید
شنبه، ۱۲ اسفند ماه ۱۳۹۶، ساعت ۲۰:۱۳

دمت گرم

راضی‌ بودم

• ناشناس
یکشنبه، ۲۶ فروردین ماه ۱۳۹۷، ساعت ۱۸:۱۹

خیلی پیچیده بود اگر میشه ساده تر بیان بشه با تشکر 02

• مهدی عسگریزاد
یکشنبه، ۱۸ فروردین ماه ۱۳۹۸، ساعت ۲۳:۵۹

درود بر روان پاکت

• مهتاب
جمعه، ۱۶ آبان ماه ۱۳۹۹، ساعت ۱۶:۵۹

خدا اجرت بده مادر131313

• محمد مهدی
جمعه، ۲۸ آبان ماه ۱۴۰۰، ساعت ۰۵:۳۶

عالی بوووود ممنون 08

• سم سام
چهارشنبه، ۱۳ بهمن ماه ۱۴۰۰، ساعت ۱۹:۰۷

هیچی نفهمیدم]0707 بگید تو حل مسئله هانوی با چند حرکت حل میشه