רקורסיב בJS
-
אני לא רואה איך האתגר הזה קשור ספיציפית ל JS אלא לתכנות באופן כללי
הנה מה שפספסת:
ראשית פעולות הכפל מתבצעות ב"עליה" מהריקורסיה ולא ב"ירידה"
שנית אין כאן שום פעולות חיבור
שלישית - ההסבר:function abc(n) { if (n == 0) {return 1;} else { var g = arguments.callee(n - 1); console.log(n + ' * ' + g); return n * g;} }; abc(5) /*output 1 * 1 2 * 1 3 * 2 4 * 6 5 * 24 120 */
פורסם במקור בפורום CODE613 ב11/08/2015 14:15 (+03:00)
-
אתה לא מגיב, מסמן תודה או מסמן כנפתר אז מה זה אומר? אני אפילו לא יודע אם קראת את התשובה שלי
אנשים משקיעים כדי לענות לך ואתה מתעלם...
האם התשובה לא מעניינת אותך ואתה סתם זורק חידות פה? השאלות האלו לא מעניינות אותי במיוחד ואם כך אני אדע לא לטרוח להגיב
פרט לכך הפורום הוא מקור ידע, ונושאים אמורים להסגר בצורה ברורהפורסם במקור בפורום CODE613 ב13/08/2015 00:35 (+03:00)
-
אתה לא מגיב, מסמן תודה או מסמן כנפתר אז מה זה אומר? אני אפילו לא יודע אם קראת את התשובה שלי
אנשים משקיעים כדי לענות לך ואתה מתעלם...
האם התשובה לא מעניינת אותך ואתה סתם זורק חידות פה? השאלות האלו לא מעניינות אותי במיוחד ואם כך אני אדע לא לטרוח להגיב
פרט לכך הפורום הוא מקור ידע, ונושאים אמורים להסגר בצורה ברורהחלילה!
ראשית תודה על המאמץ, שניכר מצורת ההגשה!
נסיתי להבין ללא הצלחה
וכמאמר הפסוק (בתנ"ך של ארכיטקט) "עדיף לנסות להבין פעם נוספת את ההסבר הקודם במקום להבין הסבר נוסף", תכננתי להדפיס ולקרוא שוב ביתר ריכוז.
לא הבנתי לאיפה נעלם בפונקציה שלך n*
ואת המשפט "ראשית פעולות הכפל מתבצעות ב"עליה" מהריקורסיה ולא ב"ירידה""שוב תודה!
פורסם במקור בפורום CODE613 ב13/08/2015 00:46 (+03:00)
-
אני לא מבין js אבל אנסה להסביר את מה שהבנתי בדברי softs ואולי זה יעזור לך אהרון..
אם אני סתם מקשקש שטויות - אז תתקנו אותי :lol: :lol:
קודם כל, הוא הסביר לך ש"כל רקורסיה מתבצעת בעליה ולא בירידה":
כלומר, כיון שפעולה רקורסיבית היא פעולה שקוראת לעצמה עד תנאי העצירה שלה, אז החישוב של הפונקציה מתבצע רק לאחר שהגענו לתנאי העצירה וזה הכונה "ירידה" דהיינו שהיא יורדת ויורדת ויורדת (קוראת לעצמה שוב ושוב) עד שהיא עוצרת, ואז מבצעת את פעולת החישוב על הנתונים שיש באותו פעם (אצלך זה 1 1 ) ואז היא מחזירה את הערך 1 לפונקציה שקראה לה (וזה הנקרא "עליה"), וממילא הפונקציה שקראה לה הייתה 2 ) ולכן היא מבצעת את החישוב 2 G כשG זה הערך שהתקבל מהחישוב בפונקציה התחתונה יותר (כאן זה 1).
ממילא כשהיא עולה לפונקציה הקודמת שקראה לה היא מחזירה לG את הערך 2, ולכן מתבצע 3G והתוצאה היא 6 והיא נשמרת במשתנה G.
וממילא למעלה יותר 46 = 24
ובסוף 5 *24 והתוצאה 120.
ולכן הוא גם אמר לך שאין פה שום פעולת חיבור אלא רק כפל.
את מה שציינת N הוא הגדיר כG, וזה כנראה אותו דבר כיון שהN-1 מתבצע רק בשעת הירידה לרקורסיה לא בשעת העליה, ולכן כשהיא עולה הערך של N ושל N-1 אינו אותו דבר.צירפתי לך כאן קישור לקובץ שמרחיב על רקורסיה ובעמודים 5-7 מתייחס בדיוק להסבר של השאלה אותה העלית (זה נקרא בעיית ה'עצרת') ולהבדל בין סוגי הפעולות הרקורסיביות.
ושוב, כמו שsofts אמר זה לא קשור לJS אלא לתכנות כללי.
בהצלחה!פורסם במקור בפורום CODE613 ב13/08/2015 10:45 (+03:00)
-
אני לא מבין js אבל אנסה להסביר את מה שהבנתי בדברי softs ואולי זה יעזור לך אהרון..
אם אני סתם מקשקש שטויות - אז תתקנו אותי :lol: :lol:
קודם כל, הוא הסביר לך ש"כל רקורסיה מתבצעת בעליה ולא בירידה":
כלומר, כיון שפעולה רקורסיבית היא פעולה שקוראת לעצמה עד תנאי העצירה שלה, אז החישוב של הפונקציה מתבצע רק לאחר שהגענו לתנאי העצירה וזה הכונה "ירידה" דהיינו שהיא יורדת ויורדת ויורדת (קוראת לעצמה שוב ושוב) עד שהיא עוצרת, ואז מבצעת את פעולת החישוב על הנתונים שיש באותו פעם (אצלך זה 1 1 ) ואז היא מחזירה את הערך 1 לפונקציה שקראה לה (וזה הנקרא "עליה"), וממילא הפונקציה שקראה לה הייתה 2 ) ולכן היא מבצעת את החישוב 2 G כשG זה הערך שהתקבל מהחישוב בפונקציה התחתונה יותר (כאן זה 1).
ממילא כשהיא עולה לפונקציה הקודמת שקראה לה היא מחזירה לG את הערך 2, ולכן מתבצע 3G והתוצאה היא 6 והיא נשמרת במשתנה G.
וממילא למעלה יותר 46 = 24
ובסוף 5 *24 והתוצאה 120.
ולכן הוא גם אמר לך שאין פה שום פעולת חיבור אלא רק כפל.
את מה שציינת N הוא הגדיר כG, וזה כנראה אותו דבר כיון שהN-1 מתבצע רק בשעת הירידה לרקורסיה לא בשעת העליה, ולכן כשהיא עולה הערך של N ושל N-1 אינו אותו דבר.צירפתי לך כאן קישור לקובץ שמרחיב על רקורסיה ובעמודים 5-7 מתייחס בדיוק להסבר של השאלה אותה העלית (זה נקרא בעיית ה'עצרת') ולהבדל בין סוגי הפעולות הרקורסיביות.
ושוב, כמו שsofts אמר זה לא קשור לJS אלא לתכנות כללי.
בהצלחה!הבנתי :mrgreen:
ועכשיו שאלה למומחים
מתי זה עדיף על for או while רגיל?פורסם במקור בפורום CODE613 ב16/08/2015 11:51 (+03:00)
-
@אהרן
ועכשיו שאלה למומחיםמתי זה עדיף על for או while רגיל?
תמיד. עדיף לולאה רגילה.
בגלל שהמחסנית מוגבלת. במקרה שלא מצאת איך לממש בצורה רגילה. אז אין ברירה משתמשים ברקורסיה.חושב שהבנת הרקורסיה חשובה מאוד בשביל לדעת מהו הדרך לפתור בעיות.
באופן אישי קשה לי יותר עם התכנון מהכתיבה עצמה.אגב, אפשרות הטורים של HTML לא עבד טוב עם ניקוד (טורים לא מאוזנים) אז הכנתי לולאה שעושה א"ז
מחרוזת או מערך עם רצף 1-8 לדוגמא מחולק למס' הטורם הנדרש לפי מקס' שורות.//Columns var menuArr = ['1','2','3','4','5','6','7','8'] var lines = 4; var col = Math.ceil(menuArr.length/lines); var tooltip = ''; if(menuArr.length < lines) lines = menuArr.length; for (var n = 0; n < lines; n++) { for (var i = 0; i < col; i++) { if(menuArr[n+(i*4)]) tooltip += (n+(i*4)+1) + ' ' +menuArr[n+(i*4)] + ' '; } tooltip = tooltip.substr(0, tooltip.length-2); tooltip += '\n'; } /* input: "1 1 5 5 2 2 6 6 3 3 7 7 4 4 8 8 " */
זו הדרך הנכונה?
המון תודה לאנשים הנפלאים פה!פורסם במקור בפורום CODE613 ב16/08/2015 23:00 (+03:00)