الجلسة التطبيقية 3: الأعداد الثنائية، والتقريب، والدوال
الجلسة التطبيقية 3 (Recitation 3)
المصادر والنسبة والترخيص
المادة الأصلية: آنا بيل (Ana Bell)، MIT OpenCourseWare (MIT OCW)، معهد ماساتشوستس للتكنولوجيا، مقرر 6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python، خريف 2022 (Fall 2022).
هذه ترجمة وتكييف عربي غير رسمي وفق رخصة CC BY-NC-SA 4.0: النسبة–غير التجاري–المشاركة بالمثل، ولا تعني اعتمادًا أو تأييدًا من MIT أو MIT OCW. شروط الاستخدام والاستشهاد.
منهج الترجمة: لكل عنوان في الملخّص الأصلي عنوان مستقل، وحُفظ ترتيب العناوين والمحاور والتذكيرات كما في الأصل. الشيفرة محفوظة بالإنجليزية، والمعادلات والرموز باقية كما هي. لم تُضمَّن صور.
المحاضرة المرتبطة
تُرافق هذه الجلسة التطبيقية المحاضرة 7: التفكيك والتجريد والدوال (Decomposition, Abstraction, Functions). ويعرض ملخّصها مراجعةً لما في المحاضرات 4 و5 و6، ثم مقدّمةً إلى الدوال (Functions) والنطاق (Scope).
تذكيرات (Reminders)
6.100L، الجلسة التطبيقية 3 — 30 سبتمبر 2022.
- مسابقة MQ4 الأربعاء المقبل 10/5.
- مجموعة المسائل PS1 مستحقّة الأربعاء المقبل.
مراجعة المحاضرة 4: برامج بسيطة، ومقدّمة إلى الأعداد الثنائية
1. البرامج البسيطة (Simple Programs)
- خوارزميات التحقّق والتخمين (guess-and-check) إحدى طرق إيجاد حلّ لمشكلة عبر التعداد الشامل (exhaustive enumeration).
- خمّن الحلّ، ثم قيّم التخمين، ثم عدّل التخمين تعديلًا مبنيًّا على فهم، وكرّر…
- كرّر هذه الخطوات حتى تجد حلًّا، أو حتى تستنفد مجموعة الحلول الممكنة لديك.
- برامج مثال: تخمين الجذر التربيعي أو الجذر التكعيبي.
2. مقدّمة إلى الأعداد الثنائية (Intro to Binary Numbers)
- تستخدم الحاسبات الأعداد الثنائية.
- كلّ شيء يُخزَّن في إحدى حالتين — إمّا 0 وإمّا 1.
- الأعداد الثنائية كفؤة، وسهلة إجراء العمليات عليها.
- تُسمّى تسلسل من الأعداد الثنائية، مثل 00110011، تسلسل بتات (sequence of bits).
- يمكن تحويل الأعداد في الأساس 10 إلى أعداد ثنائية والعكس.
بّتات الأولى الثماني هي قوى الاثنين:
ففي البتّات الثماني الأولى يمكننا تخزين أرقام حتى 256 (من دون شمولها).
مثال: حوّل العدد 56 في الأساس 10 إلى تمثيله الثنائي.
مثال 2: حوّل 00011001 إلى الأساس 10.
مراجعة المحاضرة 5: الأعداد العشرية، والكسر، وخوارزميات التقريب
1. الأعداد العشرية (Floats)
- تستخدم بايثون «الفاصلة العائمة» (floating point) لتقريب الأعداد الحقيقية.
- العمليات على الأعداد العشرية تُدخل خطأ صغيرًا جدًّا.
- أخطاء صغيرة كثيرة تتحوّل إلى خطأ أكبر.
2. الكسور والتقريب (Fractions & Approximation)
- نستخدم الفكرة نفسها لتخزين الكسور في النظام الثنائي، برفع 2 إلى أُسّ عدد سالب.
في النهاية، يمثّل الحاسوب كلّ شيء في بتات. ولذلك تُقرَّب الأعداد التي فيها خانات كثيرة بعد الفاصلة العشرية غالبًا.
ونتيجة لذلك، كن حذرًا عند المقارنة بين الأعداد العشرية وعند العمل بها.
3. خوارزميات التقريب (Approximation Algorithms)
- مثل التحقّق والتخمين، لكنّ الهدف إيجاد إجابة تُعدّ «جيدة كفاية»، وليست بالضرورة دقيقة.
- خمّن إجابة، ثم افحص إن كانت «جيدة كفاية»، فإن لم تكن عدّل تخمينك تعديلًا مبنيًّا على فهم، وكرّر حتى يصير تخمينك «جيدًا كفاية».
- المعاملات الرئيسة: مقدار الزيادة (increment)، وإيبسيلون (epsilon)، وعدد التخمينات، إلخ…
- تذكّر أن تضع في حسابك ما يحدث إن تجاوزت شرط التوقّف «قريب كفاية» — لا نريد حلقة لا نهائية.
مراجعة المحاضرة 6: البحث بالتنصيف، ونيوتن–رافسون
1. البحث بالتنصيف (Bisection Search)
- خوارزمية بحث تُطبَّق على المسائل التي فيها ترتيب طبيعي (inherent) لمجال الإجابات الممكنة (مثل قائمة أعداد مرتّبة).
- خطوات خوارزمية بحث ثنائي مبسّطة:
- خمّن نقطة منتصف المجال.
- إن لم تكن الإجابة، افحص إن كانت الإجابة أكبر أم أصغر من نقطة المنتصف.
- غيّر المجال.
- كرّر.
- تقطع هذه الطريقة مجموعة الإجابات الممكنة المراد فحصها إلى النصف في كل مرحلة، ومن ثمّ لها خاصية النموّ اللوغاريتمي، ومن ثمّ فهي خوارزمية أكثر كفاءة.
2. نيوتن–رافسون (Newton-Raphson)
- خوارزمية تقريب عامّة لإيجاد جذور كثير الحدود (polynomial) في متغيّر واحد.
- لدينا دالة كثير حدود ، والهدف حلّ المعادلة من أجل بحيث .
- بيّن نيوتن–رافسون أنّه:
-
إن كان تقريبًا للجذر ، فإنّ
تقريب أفضل، حيث هي مشتقّة .
-
المحاضرة 7: الدوال والنطاق (Functions and Scope)
الدوال (Functions)
- تلتقط الدوال العمل الحسابي داخل صندوق أسود.
- تتيح لنا إعادة استخدام الشيفرة وكتابة برامج بصياغة أكثر إيجازًا.
- تأخذ الدوال مدخلات وتُعيد مخرجات.
- تُسمّى المدخلات معاملات (parameters) للدالة، وتُعاد المخرجات عبر عبارة
return. - استدعاء دالة:
My_output = function_name(arg1, arg2, …, argN)
- وعند الاستدعاء، تُستبدل الدالة كاملةً بقيمة الإعادة (return value).
printمقابلreturn:print: للمستخدم، يعرض قيمة فحسب.return: للحاسوب، ويتيح لك إرسال قيم من الدالة إلى أجزاء أخرى من شيفرتك.- لا يُنفَّذ أيّ شيء في الدالة بعد تنفيذ عبارة
return. - القيمة المُعادة الافتراضية في بايثون هي
None.
- لا يُنفَّذ أيّ شيء في الدالة بعد تنفيذ عبارة
النطاق (Scope)
- تُتابَع إسنادات المتغيّرات في جدول رموز (symbol table) أو إطار مكدّس (stack frame) يربط أسماء المتغيّرات بقيمها.
- عند استدعاء دالة، يُنشأ إطار مكدّس جديد.
- عند إعادة الدالة، يُزال إطار المكدّس أو يُتلف.
- يقدّم Python Tutor تصورًا جيّدًا لذلك: https://pythontutor.com/.