الگوریتم چیست؟
تعریف دقیق الگوریتم، ویژگیهای یک الگوریتم درست و تبدیل یک مسئلهٔ واقعی به گامهای قابلاجرا در پایتون.
آنچه در این درس میآموزید
- تعریف دقیق الگوریتم و چهار ویژگی آن را بدانید
- یک مسئلهٔ ساده را به گامهای شمرده تبدیل کنید
- شبهکد را بخوانید و آن را به کد پایتون ترجمه کنید
فهرست مطالب
هر برنامهای که تا حالا اجرا کردهاید — از ماشینحساب تا موتور جستوجو — در نهایت یک چیز بوده است: یک الگوریتم که با زبان برنامهنویسی نوشته شده. پیش از آنکه حرفزدن دربارهٔ سرعت و بهینگی معنا پیدا کند، باید بدانید الگوریتم دقیقاً چیست و چگونه یک مسئلهٔ انسانی را به دستورهای شمرده و قابلاجرا تبدیل میکنیم. این مهارت را «تفکر الگوریتمی» مینامند و پایاننامه نیست؛ یک عادت ذهنی است که در این دوره تمرینش میکنیم.
تعریف دقیق
الگوریتم (Algorithm) یک دنبالهٔ متناهی از گامهای روشن و دقیق است که از یک ورودی شروع میشود و به یک خروجی مشخص میرسد. چهار کلمهٔ این جمله بار دارد:
- متناهی — بالاخره تمام میشود؛ برنامهای که هرگز متوقف نشود جواب مسئله را تحویل نمیدهد.
- روشن و دقیق — هر گام بیابهام است؛ «چند تا سبزیجات را کمی سرخ کن» الگوریتم نیست، «روغن را ۵ دقیقه در حرارت متوسط گرم کن» تقریباً هست.
- ورودی — صفر یا چند دادهٔ اولیه از مسئله میگیرد.
- خروجی — دستکم یک نتیجهٔ مرتبط با مسئله تولید میکند.
راستی واژهٔ الگوریتم غریبه نیست: از نام محمد بن موسی خوارزمی، ریاضیدان ایرانی سدهٔ نهم میلادی، گرفته شده که آثارش ریاضیات را به اروپا رساندند.
الگوریتم در زندگی روزمره
دستور پخت، الگوریتم است: ورودی (مواد اولیه)، گامهای دقیق و خروجی (غذا). اما تفاوت مهمی هم با برنامه دارد: انسانِ آشپز، ابهام را خودش جبران میکند. کامپیوتر این توانایی را ندارد؛ هر چیزی که نگویید، انجام نمیدهد و هر چیزی که مبهم بگویید، اشتباه میرود.
مسئلهٔ سادهای را بردارید: «بزرگترین عدد در یک فهرست را پیدا کن». یک انسان نگاهی میاندازد و جواب را میگوید؛ اما الگوریتم باید گامبهگام پیش برود:
- اولین عدد را «کاندیدای بزرگترین» بگیر.
- بقیهٔ اعداد را یکییکی ببین؛ هر عددی که از کاندیدا بزرگتر بود، آن را کاندیدای تازه کن.
- وقتی فهرست تمام شد، کاندیدا جواب است.
از شبهکد تا کد پایتون
این گامها را میتوان به یک «شبهکد» (Pseudocode) نوشت؛ متنی فارسی و بدون نحو خاص که فقط منطق را نشان میدهد:
۱. کاندیدا ← عددِ نخستِ فهرست
۲. برای هر عدد از بقیهٔ فهرست:
اگر عدد > کاندیدا:
کاندیدا ← عدد
۳. خروجی: کاندیداحالا ترجمهٔ مستقیم به پایتون:
numbers = [12, 5, 30, 7, 25]
maximum = numbers[0]
for n in numbers[1:]:
if n > maximum:
maximum = n
print("Largest number:", maximum)Largest number: 30
خطبهخط ببینید:
maximum = numbers[0]همان گام ۱ است؛ کاندیدای اولیه برابر نخستین عدد.for n in numbers[1:]یعنی «برای هر عدد از فهرست بهجز اولی» — برش[1:]از عنصر دوم به بعد را میدهد.if n > maximumشرط گام ۲ است و سطر تورفتهاش کاندیدا را بهروز میکند.- توجه کنید که عدد ۳۰ در خروجی با ارقام انگلیسی چاپ میشود؛ چون پایتون آن را چاپ میکند، نه ما.
بهسادگی، یک مسئلهٔ انسانی تبدیل شد به ۶ خط کد قابلاجرا. الگوریتم قبل از کد وجود داشت؛ کد فقط پوشاک الگوریتم به زبان پایتون است.
تمرینها
تمرین
تمرین ۱ — مجموع اعداد زوج
الگوریتمی بنویسید که مجموع اعداد زوج یک فهرست را حساب کند. اول شبهکد آن را در دو سطر بنویسید، بعد در پایتون پیاده کنید و روی فهرست [3, 8, 5, 12, 7, 6] اجرا کنید. (یادآوری: باقیماندهٔ تقسیم در پایتون با عملگر % گرفته میشود.)
# Write your code hereنمایش راهحل
شبهکد: «برای هر عدد از فهرست، اگر باقیماندهٔ تقسیمش بر ۲ صفر بود، آن را به مجموع اضافه کن؛ در پایان مجموع را چاپ کن.»
numbers = [3, 8, 5, 12, 7, 6]
total = 0
for n in numbers:
if n % 2 == 0:
total = total + n
print(total)26
::: :::
تمرین
تمرین ۲ — الگوریتم بشمار
دستور «پیدا کردن شمارهٔ تلفن یک مغازه در راهنمای کاغذی» را به شکل الگوریتم دقیق بنویسید: ورودی و خروجی را مشخص کنید و گامها را طوری بنویسید که کسی که مغازه را نمیشناسد هم بتواند اجرایش کند.
# Write your pseudocode hereنمایش راهحل
یک پاسخ ممکن:
ورودی: نام مغازه
۱. دفترچه را از صفحهٔ اول باز کن.
۲. تا رسیدن به آخر دفترچه، صفحهها را ورق بزن:
اگر در صفحهٔ فعلی نام مغازه بود، شمارهٔ کنارش را گزارش کن و تمام.
۳. اگر آخر دفترچه رسید و نام پیدا نشد، گزارش کن: «در فهرست نیست».ورودی روشن، گامهای متناهی و دقیق و دو خروجی ممکن دارد. نکتهٔ آموزشی: این الگوریتم همان «جستوجوی خطی» است که در درس بعدی از نظر سرعتش حسابکتاب خواهیم کرد.
:::
خلاصه
- الگوریتم دنبالهای متناهی، روشن و دقیق از گامهاست که از ورودی به خروجی میرسد.
- کامپیوتر ابهام را جبران نمیکند؛ هر گام باید بدون حدس قابلاجرا باشد.
- شبهکد راهی برای نوشتن منطق قبل از درگیر شدن با نحو زبان برنامهنویسی است.
- «بزرگترین عدد را پیدا کن» یک الگوریتم خطی ساده دارد که با یک متغیر کاندیدا و یک حلقه ساخته میشود.
میتوانید الگوریتم بنویسید؛ اما الگوریتمِ بد و الگوریتمِ خوب چه فرقی دارند و چطور با عدد صحبت کنیم؟ در درس بعدی زبان مشترک مهندسان برای «هزینهٔ الگوریتم» را یاد میگیرید: نماد Big-O.