البرمجة

حل مشكلة الأعداد الأولية باستخدام CLISP

في بداية تعلم لغة برمجة CLISP، يظهر أنك تحاول فهم كيفية حل مشكلة الأعداد الأولية باستخدام هذه اللغة. لكن، واستنادًا إلى الكود الذي قدمته، يظهر أن هناك بعض الأخطاء في تنفيذ الكود.

الخطأ الذي تواجهه يتعلق بمتغير c الذي تحاول استخدامه في جملة if ويظهر أنه لا يتم تعيين قيمة له في جميع الحالات. لحل هذا، يمكنك تحسين الكود عن طريق تغيير بعض الجوانب في الطريقة التي يتم فيها استخدام المتغيرات وجمل التكرار.

فيما يلي تحسين للكود:

lisp
(defun prime (num) (let ((c 0)) (loop for a from 2 to (isqrt num) until (= (mod num a) 0) finally (return (= c 0))))) (defun find-primes (limit) (loop for x from 2 to limit when (prime x) collect x into primes finally (return primes))) (setq result (find-primes 20))

في هذا التحسين، تم استخدام let لتعيين قيمة ابتدائية للمتغير c، وتم تبسيط الكود باستخدام loop و until و finally لتحسين قراءته. يتم استخدام isqrt لتحديد الحد الأقصى الذي يجب أن تتم فيه التحقق من أعداد أولية.

الآن، يمكنك استخدام الدالة find-primes للعثور على جميع الأعداد الأولية حتى الرقم الذي تحدده كحد أقصى.

المزيد من المعلومات

بالطبع، دعني أقدم لك المزيد من المعلومات حول الكود الذي قدمته وكيف يعمل:

  1. تعريف الدالة prime:

    • تم استخدام let لإنشاء متغير محلي c وتعيين قيمة ابتدائية لها (صفر في هذه الحالة).
    • تم استخدام loop لتكرار القيم من 2 إلى جذر تربيعي للعدد num باستخدام from 2 to (isqrt num).
    • تم استخدام until لإيقاف التكرار إذا تم العثور على عامل مشترك باستخدام mod.
    • تم استخدام finally لإرجاع قيمة منطقية (t أو nil) تشير إلى ما إذا كان العدد أوليًا.
  2. تعريف الدالة find-primes:

    • تم استخدام loop لتكرار الأعداد من 2 إلى الحد الأقصى المحدد.
    • تم استخدام when لاختبار ما إذا كان العدد أوليًا باستخدام الدالة prime.
    • تم استخدام collect لجمع الأعداد الأولية في قائمة.
    • تم استخدام finally لإرجاع القائمة التي تحتوي على الأعداد الأولية.
  3. استخدام isqrt:

    • تم استخدام الدالة isqrt للعثور على الجذر التربيعي لعدد num.
    • هذا يساعد في تقليل عدد الاختبارات المطلوبة للعثور على عوامل.
  4. استخدام setq في النهاية:

    • تم استخدام setq لتعيين نتيجة الدالة find-primes إلى المتغير result.

هذه التحسينات تجعل الكود أكثر فعالية وقراءة. يمكنك تغيير قيمة الحد الأقصى الممكن تحديدها في الدالة find-primes للعثور على جميع الأعداد الأولية في النطاق الذي ترغب فيه.

زر الذهاب إلى الأعلى