בחזרה לעמוד הבית

פונקציות רקורסיביות בפלאש

 

לפני השיעור הזה רצוי לעבור על השיעור ליצירת פונקציות .

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

 

להורדת קובץ דוגמא

 

מה זאת פונקציה רקורסיבית / ריקורסיה  ?

 

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

המבנה הבסיסי של ריקורסיה היא :

Function myfunction(){

myfunction();

}

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

 

מתי ומדוע נשתמש בפונקציות רקורסיביות ?

בעיקרון כל מה שריקורסיה מסוגלת לעשות ניתן לעשות גם בתוך לולאה (for או while ) , אם כן , מתי נשתמש בצורה הזאת ומתי בצורה הזאת  ? לולאות רגילות לא מעמיסות בצורה מכבידה על הזכרון של המחשב כמו הרקורסיות , עם זאת ניתן לכתוב לולאה של 50 שורות ב-4 שורות של רקורסיה .

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

  1. כאשר צריך לבצע לולאה ששומרת תוצאה של לולאה קודמת ומשתמשת בה
  1. כאשר יש הררכיה של אובייקטים וצריך לבצע אותו הדבר בכל שלב של ההררכיה .

 

דוגמא ראשונה

 

נתחיל עם דוגמא פשוטה שתציג את הנושא :

 

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)))))))))

כאשר ככל שנכנסים יותר פנימה בסוגריים מגיעים לקריאות הבאות של הפונקציה .