דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. רקורסיב בJS

רקורסיב בJS

מתוזמן נעוץ נעול הועבר ארכיון code613m
10 פוסטים 5 כותבים 552 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    אהרן
    כתב ב נערך לאחרונה על ידי
    #1

    הנה הפונקציה

    alert(function(n) {return (n == 0) ? 1 : n*arguments.callee(n - 1);}(5));
    

    מדוע זה שווה 120??
    האם לא מתבצע
    54
    +
    4
    3
    +
    32
    +
    2
    1
    +
    1
    ??
    מה אני מפספס??

    פורסם במקור בפורום CODE613 ב10/08/2015 03:14 (+03:00)

    תגובה 1 תגובה אחרונה
    0
    • S מנותק
      S מנותק
      softs
      כתב ב נערך לאחרונה על ידי
      #2

      אני לא רואה איך האתגר הזה קשור ספיציפית ל 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)

      תגובה 1 תגובה אחרונה
      1
      • S מנותק
        S מנותק
        softs
        כתב ב נערך לאחרונה על ידי
        #3

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

        פורסם במקור בפורום CODE613 ב13/08/2015 00:35 (+03:00)

        תגובה 1 תגובה אחרונה
        0
        • א מנותק
          א מנותק
          אהרן
          כתב ב נערך לאחרונה על ידי
          #4

          @softs

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

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

          שוב תודה!

          פורסם במקור בפורום CODE613 ב13/08/2015 00:46 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • S מנותק
            S מנותק
            softs
            כתב ב נערך לאחרונה על ידי
            #5

            סברתי וקיבלתי
            בהצלחה בהבנת ההסבר ואם לא תבין בכ"ז אני פה☺

            פורסם במקור בפורום CODE613 ב13/08/2015 00:54 (+03:00)

            תגובה 1 תגובה אחרונה
            1
            • A מנותק
              A מנותק
              avr416
              כתב ב נערך לאחרונה על ידי
              #6

              אני לא מבין js אבל אנסה להסביר את מה שהבנתי בדברי softs ואולי זה יעזור לך אהרון..
              אם אני סתם מקשקש שטויות - אז תתקנו אותי :lol: :lol:
              קודם כל, הוא הסביר לך ש"כל רקורסיה מתבצעת בעליה ולא בירידה":
              כלומר, כיון שפעולה רקורסיבית היא פעולה שקוראת לעצמה עד תנאי העצירה שלה, אז החישוב של הפונקציה מתבצע רק לאחר שהגענו לתנאי העצירה וזה הכונה "ירידה" דהיינו שהיא יורדת ויורדת ויורדת (קוראת לעצמה שוב ושוב) עד שהיא עוצרת, ואז מבצעת את פעולת החישוב על הנתונים שיש באותו פעם (אצלך זה 1 1 ) ואז היא מחזירה את הערך 1 לפונקציה שקראה לה (וזה הנקרא "עליה"), וממילא הפונקציה שקראה לה הייתה 2 ) ולכן היא מבצעת את החישוב 2 G כשG זה הערך שהתקבל מהחישוב בפונקציה התחתונה יותר (כאן זה 1).
              ממילא כשהיא עולה לפונקציה הקודמת שקראה לה היא מחזירה לG את הערך 2, ולכן מתבצע 3G והתוצאה היא 6 והיא נשמרת במשתנה G.
              וממילא למעלה יותר 4
              6 = 24
              ובסוף 5 *24 והתוצאה 120.
              ולכן הוא גם אמר לך שאין פה שום פעולת חיבור אלא רק כפל.
              את מה שציינת N הוא הגדיר כG, וזה כנראה אותו דבר כיון שהN-1 מתבצע רק בשעת הירידה לרקורסיה לא בשעת העליה, ולכן כשהיא עולה הערך של N ושל N-1 אינו אותו דבר.

              צירפתי לך כאן קישור לקובץ שמרחיב על רקורסיה ובעמודים 5-7 מתייחס בדיוק להסבר של השאלה אותה העלית (זה נקרא בעיית ה'עצרת') ולהבדל בין סוגי הפעולות הרקורסיביות.
              ושוב, כמו שsofts אמר זה לא קשור לJS אלא לתכנות כללי.
              בהצלחה!

              פורסם במקור בפורום CODE613 ב13/08/2015 10:45 (+03:00)

              תגובה 1 תגובה אחרונה
              2
              • א מנותק
                א מנותק
                אהרן
                כתב ב נערך לאחרונה על ידי
                #7

                @avr416

                אני לא מבין js אבל אנסה להסביר את מה שהבנתי בדברי softs ואולי זה יעזור לך אהרון..
                אם אני סתם מקשקש שטויות - אז תתקנו אותי :lol: :lol:
                קודם כל, הוא הסביר לך ש"כל רקורסיה מתבצעת בעליה ולא בירידה":
                כלומר, כיון שפעולה רקורסיבית היא פעולה שקוראת לעצמה עד תנאי העצירה שלה, אז החישוב של הפונקציה מתבצע רק לאחר שהגענו לתנאי העצירה וזה הכונה "ירידה" דהיינו שהיא יורדת ויורדת ויורדת (קוראת לעצמה שוב ושוב) עד שהיא עוצרת, ואז מבצעת את פעולת החישוב על הנתונים שיש באותו פעם (אצלך זה 1 1 ) ואז היא מחזירה את הערך 1 לפונקציה שקראה לה (וזה הנקרא "עליה"), וממילא הפונקציה שקראה לה הייתה 2 ) ולכן היא מבצעת את החישוב 2 G כשG זה הערך שהתקבל מהחישוב בפונקציה התחתונה יותר (כאן זה 1).
                ממילא כשהיא עולה לפונקציה הקודמת שקראה לה היא מחזירה לG את הערך 2, ולכן מתבצע 3G והתוצאה היא 6 והיא נשמרת במשתנה G.
                וממילא למעלה יותר 4
                6 = 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)

                תגובה 1 תגובה אחרונה
                0
                • M מנותק
                  M מנותק
                  magicode
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @אהרן

                  ועכשיו שאלה למומחים
                  מתי זה עדיף על for או while רגיל?

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

                  פורסם במקור בפורום CODE613 ב16/08/2015 17:49 (+03:00)

                  תגובה 1 תגובה אחרונה
                  1
                  • א מנותק
                    א מנותק
                    אהרן
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @mat

                    @אהרן
                    ועכשיו שאלה למומחים

                    מתי זה עדיף על 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)

                    תגובה 1 תגובה אחרונה
                    0
                    • רחמיםר מנותק
                      רחמיםר מנותק
                      רחמים מורחק
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @אהרן

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

                      זה סימן טוב, כי זה אומר שאתה מתכנן היטב, וכך צריך להיות.

                      פורסם במקור בפורום CODE613 ב17/08/2015 22:11 (+03:00)

                      תגובה 1 תגובה אחרונה
                      1

                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום