רקורסית זנב
שפת LISP היא שפה בה אנו מסתמכים במידה
רבה על שימוש ברקורסיות. כידוע משפות אחרות שימוש ברקורסיה לרוב פוגע בביצועי
התוכנית. נרצה לגרום לכך שלמרות שאנו משתמשים ברקורסיה התוכנית שלנו תהיה יעילה.
המהדר, כאשר הוא יכול, הופך את
הרקורסיות שאנחנו כותבים ללולאות כאשר הוא מממש אותן, ובכך אנו משיגים את השיפור
שאנו מעוניינים בו.
כדי שלמהדר יהיה קל לעשות זאת, אנו
נעדיף כשאפשר להשתמש ברקורסיה הנקראת רקורסית זנב.
הרעיון של רקורסיה זו: כאשר אנחנו
מגיעים לתנאי העצירה של הרקורסיה, יש בידינו את תוצאת החישוב, וכל מה שעלינו לעשות
זה להחזיר את התוצאה.
לדוגמא, כך תראה פונקציה לחישוב עצרת
ללא רקורסית זנב:
(defun
azeret (n)
(if (= n 0)
1
(* n ( azeret (- n 1)))
)
)
כאשר אנחנו מגיעים לתנאי העצירה, אנחנו
מתחילים לעלות כדי להחזיר את התוצאה הסופית.
עם רקורסית זנב, הפונקציה תראה כך:
(defun
azeret-aux(n res)
(if (= n 0)
res
(azeret-aux (- n 1) (* res n))
)
)
(defun azeret (n)
(azeret-aux n 1)
)
הגדרנו פונקצית עזר, המקבלת כפרמטר נוסף
את התוצאה עד כה. כאשר אנו מגיעים לסוף הרקורסיה, אנו פשוט מחזירים אותו.
לימוד שפת LISP
בתור חובב תכנות ללא ניסיון רב אני מעונין ללמוד באופן פרטי את שפת ליספ בתורשפת אם לתכנות פונקציונלי. אינני עוסק בתכנות ואינני מתכוון להרויח משפת תכנות מדובר רק בלימוד תכנות כהובי. אודה לך אם תןכל להתקשר לטלפון 050-6262013
תודה