רקורסית זנב

שפת 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
תודה
מאת: white-dragon

שימוש של lisp

אפשר לכתוב בlisp מקרואים וקיצורים חדשים לemacs.
שיתוף:
| עוד