אלגוריתים לפיתרון בעיית "מגדלי האנוי" - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

אלגוריתים לפיתרון בעיית "מגדלי האנוי"


assaf990

Recommended Posts

הרקורסיבית די פשוטה ומובנת.

האלגוריתם הוא:

בהינתן, למשל, מגדל בעל 5 קומות, הזז (ברקורסיה) את 4 הקומות העליונות מעמוד א' לעמוד ב'.

הזז את הקומה החמישית (התחתונה, שנשארה לבד) מעמוד א' לעמוד ג'.

הזז (שוב ברקורסיה) את 4 הקומות מעמוד ב' לעמוד ג' (על הגב של הקומה החמישית).

פשוט וקל, לא? כמה כיף שיש רקורסיה לפעמים :)

קישור לתוכן
שתף באתרים אחרים

זה לא מה שהקומפיילר עושה, פשוט לא.

תהליך "הפוך לפתרון שהוא לא טכנית רקורסיה" נקרא פריסה ובמידה ולא משנים את האלגוריתם אין לו שום תועלת (מבחינת נוחות/יעילות)

מה שכן, אם הרקורסיה שכתבת אינה משתמשת במחסנית כלל (לא מקבלת פרמטרים ולא משתמשת בערך החזרה מהקריאה הקודמת) אז חלק מהקומפיילרים בחלק מהשפות יעשו ליניאריזציה של הרקורסיה שלך (ואז היעילות קורבה מאד ליעילות של לולאה) ובשאר ניתן לפרוס את הרקורסיה ואז לעשות תהליך דומה ידנית.

קיצר... גלשנו..

מטי.

קישור לתוכן
שתף באתרים אחרים

פשוט כן.

הקומפיילר מייצר קוד שמשתמש ב- stack, כך שכל קריאה לפונקציה גורמת להוספת עוד מסגרת ל- stack שבה נשמרים המשתנים הלוקאליים והפרמטרים (אין בזה שום דבר מיוחד לגבי רקורסיה).

את ה- CPU לא מעניין שאצלך בקוד יש רקורסיה, או אפילו פונקציה. הוא פשוט סדרה של קפיצות, ועדכון ה- stack.

קישור לתוכן
שתף באתרים אחרים

ברוב המקרים ההבדל הוא לא משמעותי.

כמו שאמרו כאן קודם, פריסה של רקורסיה בדר"כ הופכת את הקוד לפחות "יפה".

המקרה היחיד שבו הייתי להפוך רקורסיה ללולאה היה בתנאים לא סטנדרטיים (Stack מאוד קטן, ורקורסיית-זנב פשוטה יחסית).

קישור לתוכן
שתף באתרים אחרים

לאו דווקא. באופן כללי, אם נתון לך אלגוריתם רקורסיבי עדיף לך פשוט לכתוב אותו כמו שהוא ולתת לקומפיילר/יחידת ביצוע במעבד לשבור את הראש.

מקרה קצה שבו זה לא בהכרח הפיתרון העדיף הוא באלגוריתמיים רקורסיביים "מסוכנים": קח, לדוגמא, quicksort נאיבי שבוחר את האבר השמאלי כ-pivot, תן לו מערך ענק (נאמר, n=10000) ממויין מראש. תקבל עומק רקורסיה של 9999, שבקלות יכול לגרום ל-stack overflow. אחת הדרכים (הפחות אלגנטיות, לטעמי) להתמודד עם הבעיה הזו היא לממש את הרקורסיה באמצעות בלוק שמתפקד כמחסנית - רקורסיה ידנית, בהיעדר תאור יותר מתאים - ולהגביל את הרקורסיה ע"י תנאי. כמובן שאפשר לממש את אותו פיתרון ע"י שליחת עומק הרקורסיה כפרמטר לפונקציה, אבל אז זה בזבזני אפילו יותר.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...