حلقه‌های تو در تو

حلقه‌های تو در تو

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

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

clock

به عنوان مثال اگر به ساعت توجه کنید. به ازای یک بار چرخشِ عقربه‌ی دقیقه شمار، عقربه‌ی ثانیه شمار ۶۰ بار  می‌چرخد.

برای روشن شدن بهتر مطلب به مثال زیر توجّه کنید:

 for i in range(3):

       for j in range(5):

             statement(a)

       statement(b)

در این مثال، دستورات statement(a) به ازای هر تغییر و چرخش i در حلقه‌ی بیرونی، به تعداد j یعنی ۵ بار اجرا می‌شود و چون خود i به اندازه ۳ بار شمرده می‌شود، در جمع ۱۵ بار انجام خواهد شد.

امّا statement(b) که در حلقه‌ی بیرونی قرار دارد فقط ۳ بار اجرا خواهد شد.

مثال بالا مربوط به حلقه for تو در تو بود. مانند همین برای حلقه‌ی while نیز نوشته می‌شود.

 while i شرط:

      while j شرط:

             statement(a)

       statement(b)

در مثال بالا، دستورات statement(a) به ازای هر تغییر و چرخش i در حلقه‌ی بیرونی، به تعداد برقرار بودن شرط j  اجرا می‌شود و چون خود i به اندازه برقراری شرط خودش شمرده می‌شود، در جمع به اندازه‌ی حاصل‌ضرب تعداد انجام دو شرط انجام خواهد شد.

امّا statement(b) که در حلقه‌ی بیرونی قرار دارد فقط به تعداد برقرار بودن شرط i اجرا خواهد شد.

ترکیب این دو مدل یعنی استفاده از حلقه‌ی for  و while به صورت تو در تو نیزمرسوم و قابل استفاده است. به مثال زیر توجّه کنید:

 while i شرط:

       for j in range(n):

             statement(a)

       statement(b)

عکس این حالت هم قابل استفاده می‌باشد که for حلقه‌ی بیرونی و while درونی باشد…

نکته:

در بعضی موارد از متغیّری که  در حلقه‌ی بیرونی استفاده شده، داخل حلقه‌ی درونی استفاده می‌کنیم. بر طبق مثال زیر حلقه‌ی بیرونی n بار ولی حلقه‌ی داخلی به اندازه‌ی فعلی عدد i می‌چرخد. پس حلقه‌ی داخلی ابتدا یک بار، دفعه دوم ۲ بار، سومین بار ۳بار و … تا n بار خواهد چرخید.

 for i in range(n):

       for j in range(i):

             statement(a)

       statement(b)

حال به عنوان مثال سعی کنید برنامه‌ای بنویسید که شکل زیر را رسم کند:

*
**
***
****
*****
******

نکته:

در دستور  print به صورت پیش فرض تعریف شده که در پایان چاپ عبارات نوشته شده در پرانتز، به ابتدای خطّبعدی برود و دستور بعدی را از آن‌جا آغاز نماید. برای آن که بگوییم به ابتدای خط بعد نرود و در انتهای مطلب چاپ شده‌ی قبلی بماند از عبارت end=” با دو عدد quote خالی به صورت زیر استفاده می‌کنیم:

print(‘Enter a value:, end=”)

برای حل مثال بالا  از دستورات زیر استفاده می‌کنیم:

 for i in range(6):

       for j in range(i):

             print(‘*, end=”)

       print()

دقّت کنید که دستور print خالی در انتهای حلقه‌ی اوّل برای انداختن سر خط بعد در انتهای ستاره‌ها به کار می‌رود.

  • حال سعی کنید که تعداد ستاره ها را از کاربر دریافت کنید و برنامه‌ی خود را تکمیل نمایید
  • در مرحله‌ی بعد عکس این عمل را انجام دهید یعنی از n شروع کنید و به یک برسید تا یک فلش بزرگ با ستاره رسم شود…
  • در مرحله‌ی کامل‌تر می توان حرفی که می‌خواهیم تکرار کنیم را از کاربر دریافت کنیم.