פונקציות רקורסיביות בפלאש
|
|
|
|
לפני השיעור הזה רצוי לעבור על השיעור ליצירת פונקציות . |
|
השיעור על פונקציות רקורסיביות
הוא קצת שונה מהשיעורים שעברתם עליה ם עד עכשיו . השיעור הזה מדבר על שינוי
בתפיסה של צורת עבודה ולכן אל תנסו לתפוס הכל ברגע אחד . תקראו , תנסו ותקראו
עוד קצת , אבל הכי חשוב , קחו את הזמן להבין את השיטה , כי זה כל הרעיון . |
|
|
|
|
מה זאת פונקציה רקורסיבית / ריקורסיה ?
|
|
|
|
בניגוד לפונקציות רגילןת
שמבצעות את עצמם פעם אחת כאשר הם מכילות לולאות , פעולות שונות וקריאות
לפונקציות אחרות , ריקורסיה היא פונקציה שקוראת לעצמה . |
|
המבנה הבסיסי של ריקורסיה היא : |
|
Function myfunction(){ |
|
myfunction(); |
|
} |
|
כלומר הפונקציה תקרא לעצמה ,
שתקרא לעצמה , שתקרא לעצמה בצורה רין סופית עד שאנחנו נפסיק אותה . זאת אומרת
שסדרת הפקודות שיהיו בתוך הפונקציה יחזרו על עצמם שוב ושוב . |
|
|
|
מתי ומדוע נשתמש בפונקציות
רקורסיביות ? |
|
בעיקרון כל מה שריקורסיה מסוגלת
לעשות ניתן לעשות גם בתוך לולאה (for
או while ) , אם כן , מתי נשתמש
בצורה הזאת ומתי בצורה הזאת ?
לולאות רגילות לא מעמיסות בצורה מכבידה על הזכרון של המחשב כמו הרקורסיות , עם
זאת ניתן לכתוב לולאה של 50 שורות ב-4 שורות של רקורסיה . |
|
ישנם מתכנתים שיעדיפו לעבוד
בצורה הזאת , ויש כאלה שבצורה אחרת . אחרי שתבינו את העיקרון של הפונקציות
הרקורסיביות תוכלו להחליט בעצמכם מהי השיטה העדיפה לכם בהתאם למצב או למשימה
שעליכם לבצע . אבל , יש שני מצבים מרכזיים שבהם בדרך כלל עדיף להשתמש ברקורסיה : |
|
|
|
|
דוגמא ראשונה
|
|
|
|
נתחיל עם דוגמא פשוטה שתציג את
הנושא : |
|
|
|
function show(whattoshow,times){ |
|
if(times==0)return; |
|
trace(whattoshow); |
|
show(whattoshow,times-1); |
|
} |
|
|
|
show(“hello”, 4); |
|
|
|
התוצאה שתתקבל בחלון ה-output : |
|
hello |
|
hello |
|
hello |
|
hello |
|
|
|
נעבור על הדוגמא שלב אחרי שלב : |
|
|
|
התוכנית עצמה מתחילה בשימוש
בפונקציה show
, על ידי הכנסת המשפט : |
|
show(“hello”,4) |
|
הפרמטרים שהכנסנו : "hello” - המילה שתודפס , 4 –
מספר ההדפסות . |
|
|
|
הפונקציה מתבצעת בשלב הראשון
בצורה הבאה : |
|
|
|
4 שונה מ-0 ולכן לא תתבצע הפקודה return (משמעותה כאן סיום הפונקציה) |
|
הפקודה הבאה אחריה תציג "hello" בחלון ה-output . |
|
ולאחר מכן תבוצע שוב הפונקציה
עם הפחתה של מספר : |
|
show(“hello”,4){ |
|
if(times==0)return; |
|
trace("hello”); |
|
show("hello”,3); |
|
} |
|
|
|
הביצוע השני של הפונקציה |
|
show("hello”,3); |
|
|
|
3 שונה מ-0 ולכן לא תתבצע הפקודה return (משמעותה כאן סיום הפונקציה) |
|
הפקודה הבאה אחריה תציג "hello" בחלון ה-output . |
|
ולאחר מכן תבוצע שוב הפונקציה
עם הפחתה של מספר : |
|
show(“hello”,3){ |
|
if(times==0)return; |
|
trace("hello”); |
|
show("hello”,2); |
|
} |
|
|
|
הביצוע השלישי של הפונקציה |
|
show("hello”,2); |
|
|
|
2 שונה מ-0 ולכן לא תתבצע הפקודה return (משמעותה כאן סיום הפונקציה) |
|
הפקודה הבאה אחריה תציג "hello" בחלון ה-output . |
|
ולאחר מכן תבוצע שוב הפונקציה
עם הפחתה של מספר : |
|
show(“hello”,2){ |
|
if(times==0)return; |
|
trace("hello”); |
|
show("hello”,1); |
|
} |
|
|
|
הביצוע הרביעי של הפונקציה |
|
show("hello”,1); |
|
|
|
3 שונה מ-0 ולכן לא תתבצע הפקודה return (משמעותה כאן סיום הפונקציה) |
|
הפקודה הבאה אחריה תציג "hello" בחלון ה-output . |
|
ולאחר מכן תבוצע שוב הפונקציה
עם הפחתה של מספר : |
|
show(“hello”,1){ |
|
if(times==0)return; |
|
trace("hello”); |
|
show("hello”,0); |
|
} |
|
הביצוע החמישי של הפונקציה |
|
show("hello”,0); |
|
|
|
0 שווה ל-0 ולכן תתבצע
הפקודה return
והפונקציה מסתיימת . |
|
|
|
show(“hello”,3){ |
|
if(times==0)return; |
|
} |
|
|
|
כאשר מסתיים השלב החמישי חוזרים
לשלב הרביעי שקרא לו ואחרי זה לשלישי שקרא לו ולשני עד שמגיעים לשלב לביצע את
הפונקציה מההתחלה . |
|
|
דוגמא שניה |
|
|
|
בדוגמא הזאת נחשוב כיצד לייצר
לולאה רקורסיבית שתחשב לנו כפל של שני מספרים . |
|
|
|
פעולת כפל עובדת בצורה הבאה –
התוצאה הסופית שווה לבסיס פלוס עצמו . מספר הפעמים שבהם מתבצעת החיבור תלוי
במספר השני . לדוגמא : |
|
8*3=8+8+8=24 |
|
פעולה זו היא בעצם חוזרת על
עצמה כלומר המספר הראשון פלוס המספר השני , התוצאה שלהם פלוס המספר השלישי ,
התוצאה שלהם פלוס המספר הרביעי וכן הלאה . |
|
אפשר להגדיר פעולה זו על ידי
המשפט : |
|
|
|
Total=x+(total-פחות פעולה אחת) |
|
|
|
התוצאה שווה לעצמה פלוס מספר
חדש . זו הפעולה שתהיה הקו העיקרי שלנו בכל לולאה שתחזור על עצמה . כיצד נקבע את
מספר הפעמים שהיא תחזור על עצמה – על ידי המספר השני . |
|
Function
cefel(first,second){ |
|
If (second==0){ |
|
return 0; |
|
} |
|
return
(first+cefel(first,second-1)); |
|
} |
|
|
|
x=cefel(9,9); |
|
trace(x); |
|
|
|
output: |
|
81 |
|
|
|
בסופו של דבר התוצאה המתקבלת היא
: |
|
return(9+(9+(9+(9+(9+(9+(9+(9+(9))))))))) |
|
כאשר ככל שנכנסים יותר פנימה
בסוגריים מגיעים לקריאות הבאות של הפונקציה . |