מה החסרונות של רקורסיה?

Scott

New member
אין חיסרון משמעותי

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

Scott

New member
אני לא זוכר משהו ספציפי

עוד נקודה חלשה שאמורה להיות מוגדרת היטב היא תנאי העצירה של הרקורסיה (לדוגמא בעצרת, כאשר I=0 או 1) אחרת תקבל תוצאה שגויה. Scott
 

DCoder

New member
שימוש במחסנית הינו חסרון

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

Scott

New member
כמו שהתכוונתי, כל מקרה אמור להיבדק

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

ihovav

New member
רקורסיה

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

GuardianAnge1

New member
ולסיכום העניין

כשניתן, עדיף שלא להשתמש ברקורסיה, אלא בקוד איטרטיבי (לולאה). אגב, הפיכת קוד רקורסיבי לאיטרטיבי, נקראית "תיכנון דינמי".. אין לי מושג למה :eek:)
 

Scott

New member
"תכנות דינאמי"

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

aradori

New member
תוספת חשובה...

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