اساساً دو نوع «حلقه» وجود دارد:
هر دو در Julia امکانپذیرند، هرچند دومی ممکن است رایجتر باشد.
while
برای مسائل بازی که تعداد دورهای حلقه از پیش معلوم نیست، Julia حلقهی while را دارد.
شکل پایهای آن نسبتاً ساده است:
while condition
do_something()
end
در این حالت، برنامه آنقدر دور حلقه ادامه میدهد تا condition دیگر true نباشد.
دو راه برای خروج زودهنگام از حلقه وجود دارد:
break باعث خروج از حلقه میشود و اجرا از خط بعدی پس از end حلقه ادامه مییابد.return x اجرای تابع جاری را متوقف میکند و مقدار بازگشتی x را به فراخوانکننده برمیگرداند.با وجود این گزینهها، گاهی راحت است که یک حلقهی «بینهایت» با while true ... end بسازید و سپس با یافتن شرطی برای توقف در بدنهی حلقه، یک break یا return را فعال کنید.
سادهترین مثال، حلقه زدن روی یک بازه است.
اگر بخواهیم کاری را ۱۰ بار انجام دهیم:
for n in 1:10
do_something(n)
end
اگر تکرار جاری شرطی را برآورده نکند، میتوان با یک continue بیدرنگ به تکرار بعدی پرید:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
در شکلی کوتاهتر، میتوان بلوک if را با is_useless(n) && continue جایگزین کرد.
میتوان روی انواع دیگری از مجموعهها هم حلقه زد: عناصر یک آرایه، کاراکترهای یک رشته، کلیدهای یک دیکشنری...
مثالهای تا اینجا روی بازهی 1:10 حلقه میزنند، که در آن مقدار همان اندیس حلقه هم هست.
بهطور کلیتر، ممکن است به اندیس نیاز باشد و نه فقط به مقدار.
برای این کار از تابع eachindex() استفاده میشود، مثلاً for i in eachindex(my_array) ... end.
دوستتان لی می یک آبمیوهفروشی دارد که در آن آبمیوههای ترکیبی خوشمزهای میفروشد. شما مشتری همیشگی مغازهاش هستید و متوجه شدهاید که میتوانید زندگی دوستتان را راحتتر کنید. تصمیم میگیرید از مهارتهای برنامهنویسیتان برای کمک به لی می در کارش استفاده کنید.
لی می دوست دارد از قبل به مشتریانش بگوید که برای آبمیوهای که از منو سفارش دادهاند چقدر باید منتظر بمانند.
به خاطر سپردن اعداد دقیق برایش سخت است، چون زمان لازم برای ترکیب آبمیوهها متفاوت است.
"Pure Strawberry Joy" نیم دقیقه طول میکشد، "Energizer" و "Green Garden" هر کدام ۱٫۵ دقیقه، "Tropical Island" ۳ دقیقه و "All or Nothing" ۵ دقیقه.
برای بقیهی نوشیدنیها (مثلاً پیشنهادهای ویژه) میتوانید زمان آمادهسازی ۲٫۵ دقیقه را در نظر بگیرید.
برای کمک به دوستتان، تابعی به اسم time_to_mix_juice بنویسید که یک آبمیوه از منو را به عنوان ورودی میگیرد و برمیگرداند که ترکیب آن نوشیدنی چند دقیقه طول میکشد.
julia> time_to_mix_juice("Tropical Island")
3
julia> time_to_mix_juice("Berries & Lime")
2.5
بسیاری از نوشیدنیهای ابتکاری لی می قاچ لیموترش دارند، چه به عنوان یک مادهی اولیه و چه به عنوان بخشی از تزیین. پس وقتی صبح شیفتش را شروع میکند، باید مطمئن شود که ظرف قاچهای لیموترش برای روز پیش رو پر است.
تابع limes_to_cut را پیادهسازی کنید که دو ورودی میگیرد: تعداد قاچهای لیموترشی که لی می باید ببرد و آرایهای از لیموترشهای کامل که در دسترس دارد.
او از یک لیموترش "small" ۶ قاچ، از یک لیموترش "medium" ۸ قاچ و از یک لیموترش "large" ۱۰ قاچ به دست میآورد.
او همیشه لیموترشها را به همان ترتیبی که در فهرست آمدهاند میبرد و از اولین عنصر شروع میکند.
او ادامه میدهد تا به تعداد قاچهایی که لازم دارد برسد یا تا لیموترشهایش تمام شود.
لی می میخواهد از قبل بداند که چند لیموترش باید ببرد.
تابع limes_to_cut باید برگرداند که چند لیموترش باید بریده شود.
julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4
لی می دوست دارد بداند که ترکیب سفارشهایی که مشتریان منتظرشان هستند چقدر طول میکشد.
تابع order_times را پیادهسازی کنید که یک صف از سفارشها میگیرد و برداری از زمانهای ترکیب را برمیگرداند.
julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]
لی می همیشه تا ساعت ۳ بعدازظهر کار میکند. بعد کارمندش دمیتری کار را به دست میگیرد. وقتی شیفت لی می تمام میشود، اغلب نوشیدنیهایی هستند که سفارش داده شدهاند اما هنوز آماده نشدهاند. آن وقت دمیتری بقیهی آبمیوهها را آماده میکند.
برای اینکه تحویل کار راحتتر باشد، تابعی به اسم remaining_orders پیادهسازی کنید که دو ورودی میگیرد: تعداد دقیقههای باقیمانده از شیفت لی می و آرایهای از آبمیوههایی که سفارش داده شدهاند اما هنوز آماده نشدهاند.
این تابع باید سفارشهایی را برگرداند که لی می نمیتواند پیش از پایان روز کاریاش آماده کردنشان را شروع کند.
زمان باقیمانده از شیفت همیشه بزرگتر از ۰ خواهد بود. آرایهی آبمیوههایی که باید آماده شوند هرگز خالی نخواهد بود. به علاوه، سفارشها به همان ترتیبی که در آرایه آمدهاند آماده میشوند. اگر لی می ترکیب نوشیدنی خاصی را شروع کند، همیشه آن را تمام میکند، حتی اگر مجبور شود کمی بیشتر کار کند. اگر سفارش باقیماندهای نباشد که دمیتری باید به آن رسیدگی کند، باید یک بردار خالی برگردانده شود.
julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]