في بداية تعلم لغة برمجة 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
للعثور على جميع الأعداد الأولية حتى الرقم الذي تحدده كحد أقصى.
المزيد من المعلومات
بالطبع، دعني أقدم لك المزيد من المعلومات حول الكود الذي قدمته وكيف يعمل:
-
تعريف الدالة
prime
:- تم استخدام
let
لإنشاء متغير محليc
وتعيين قيمة ابتدائية لها (صفر في هذه الحالة). - تم استخدام
loop
لتكرار القيم من 2 إلى جذر تربيعي للعددnum
باستخدامfrom 2 to (isqrt num)
. - تم استخدام
until
لإيقاف التكرار إذا تم العثور على عامل مشترك باستخدامmod
. - تم استخدام
finally
لإرجاع قيمة منطقية (t
أوnil
) تشير إلى ما إذا كان العدد أوليًا.
- تم استخدام
-
تعريف الدالة
find-primes
:- تم استخدام
loop
لتكرار الأعداد من 2 إلى الحد الأقصى المحدد. - تم استخدام
when
لاختبار ما إذا كان العدد أوليًا باستخدام الدالةprime
. - تم استخدام
collect
لجمع الأعداد الأولية في قائمة. - تم استخدام
finally
لإرجاع القائمة التي تحتوي على الأعداد الأولية.
- تم استخدام
-
استخدام
isqrt
:- تم استخدام الدالة
isqrt
للعثور على الجذر التربيعي لعددnum
. - هذا يساعد في تقليل عدد الاختبارات المطلوبة للعثور على عوامل.
- تم استخدام الدالة
-
استخدام
setq
في النهاية:- تم استخدام
setq
لتعيين نتيجة الدالةfind-primes
إلى المتغيرresult
.
- تم استخدام
هذه التحسينات تجعل الكود أكثر فعالية وقراءة. يمكنك تغيير قيمة الحد الأقصى الممكن تحديدها في الدالة find-primes
للعثور على جميع الأعداد الأولية في النطاق الذي ترغب فيه.