SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
Recursion - 11                                                      Computer Programming using Java              145
  CHAPTER                                               การเวียนเกิด
      11                                                 (Recursion)
1. ความร้ ูเบืองต้ นเกี่ยวกับการเวียนเกิด (Introduction to Recursion)
              ้
1. นิยามของการเวียนเกิด
   1) การเวียนเกิด (Recursion) คือ ปรากฏการณ์ที่มีการวนกลับไปอ้ างอิงถึง
       ตัว เองซํ า แล้ ว ซํ ้าเล่า แบบไม่ร้ ูจ บ ซึ่ง มี ป รากฎอยู่ใ นหลายๆ วงการ เช่ น
                  ้
       ศิลปะ ดนตรี คณิตศาสตร์ และรวมถึงคอมพิวเตอร์ อีกด้ วย ในภาษาจาวา
       นันการเวียนเกิดจะเกิดขึ ้นได้ กบเมท็อด
         ้                                  ั
   2) เมท็อดแบบเวียนเกิด (Recursive Method) คือ เมท็อดที่เรี ยกใช้ เมท็อด
       ตัวเองซํ ้าภายในเมท็อดนั ้น (จะทําหน้ าที่เป็ นทังผู้เรี ยกและผู้ที่ถกเรี ยกใน
                                                                 ้            ู
       เวลาเดียวกันกับเมท็อดตัวเดียวกัน) ซึงจะมีกระบวนการทํางานทุกอย่าง
                                                         ่
       เหมือนกับการวนซํ ้า (Iteration) ในบทที่ 4 ทุกประการแต่จะไม่มีคําสัง            ่
       while หรื อ for ที่กล่าวไว้ ในบทที่ 4 ปรากฎอยูเลย       ่
   3) การเขียนโปรแกรมแบบเวียนเกิด (Recursive Programming) คือ การ Droste Effect คือภาพที่ปรา-
                                                                                        กฏการเวียนเกิดภายในภาพ
       เขียนโปรแกรมโดยให้ เมท็อดใดเมท็อดหนึ่งหรื อหลายเมท็อด เรี ยกใช้ เม-
       ท็อดตัวเองซํ ้าภายในเมท็อดนันไปเรื่ อยๆ จนกว่าจะหลุดพ้ นจาก เงื่อนไขหรื อสิ ้นสุดการเวียนเกิด
                                          ้

2. ขันตอนการทํางานของเมท็อดแบบเวียนเกิด จะประกอบไปด้ วย 2 กรณี คือ
     ้
   1) กรณีเวียนเกิด (Recursion Case) เป็ นกรณีที่เมท็อดคืนค่าที่เกิดจากการเรี ยกใช้ งานเมท็อดตัวมันเอง
       เช่น return fac(n-1), return fibo(n-1) + fibo(n-2) เป็ นต้ น ซึงเสมือนเป็ นการเรี ยกซํ ้า
                                                                                      ่
       เมท็อดตัวเองอีกครังอยู่ภายในเมท็อดนัน โดยเมท็อดจะเรี ยกซํ ้าแบบนี ้ไปเรื่ อยๆ จนกว่าจะเข้ าสูกรณีฐาน
                              ้                  ้                                                  ่
       จึงจะหยุดการเรี ยกซํ ้า
   2) กรณีฐาน (Base Case) เป็ นกรณีสิ ้นสุดการเวียนเกิด หรื อกรณีที่เมท็อดสามารถทํางานเสร็ จได้ ทนทีโดย
                                                                                                      ั
       ไม่ต้องมีการเรี ยกซํ ้าอีก ซึงเมท็อดจะคืนค่าคงที่คาใดค่าหนึงออกมา เช่น return 1, return n เป็ นต้ น
                                    ่                    ่        ่

3. ตัวอย่ างเมท็อดแบบเวียนเกิด
   กําหนดให้ เมท็อด f(…) ใช้ หาผลบวกของตัวเลขจํานวนเต็มตังแต่ 0 จนถึง n โดยที่ f(n) = (0+1+2+
                                                         ้                                             … +n)

   ใช้ หลักการวนซํา (Iteration: for)
                   ้                                ใช้ หลักการเวียนเกิด (Recursion)
      1    public static int f(int n) {                     1    public static int f(int n) {
      2      int s = 0;                                     2      if(n <= 0) {
      3      for(int i = n; i >= 0; i--) {                  3        return 0;    กรณีฐาน
      4        s += i;                                      4      } else {
      5      }                                              5        return f(n - 1) + n;
      6      return s;        วนกลับหลัง                    6      }
      7    }                                                7    }              กรณีเวียนเกิด

© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
146   Computer Programming using Java                                                                         11 - Recursion


  โจทย์ ข้อที่ 1 [ระดับง่ าย] จากการทํางานแบบเวียนเกิดของเมท็อด f(…) ก่ อนหน้ านี ้ จงแสดงรายละเอียด
  การทํางานของเมท็อดดังกล่ าวเมื่อเรี ยกใช้ f(5) (10 คะแนน)
           เรี ยก            เรี ยก           เรี ยก             เรี ยก             เรี ยก          เรี ยก



          ผลลัพธ์          ผลลัพธ์          ผลลัพธ์            ผลลัพธ์            ผลลัพธ์          ผลลัพธ์
                                                                                                                   เวียนเข้ า




          รอบที่ 1          รอบที่ 2        รอบที่ 3           รอบที่ 4           รอบที่ 5         รอบที่ 6
           คืนค่ า           คืนค่ า         คืนค่ า            คืนค่ า             คืนค่ า         คืนค่ า



          ผลลัพธ์           ผลลัพธ์         ผลลัพธ์            ผลลัพธ์            ผลลัพธ์          ผลลัพธ์



                                                                                                                  เวียนออก



          รอบที่ 1          รอบที่ 2        รอบที่ 3           รอบที่ 4           รอบที่ 5         รอบที่ 6
  โจทย์ ข้อที่ 2 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน)
   1     public static int mul(int x, int y) {                            การเรียกใช้         คําตอบ
      2              if (x >= 1) {
      3                return y + mul(x - 1, y);                                              mul(4, 3)
      4              } else {
      5                return 0;                                                              mul(5, 7)
      6              }
      7       }
                                       เรี ยกการเวียนเกิดแบบนี ้ว่า Linear Recursion          mul(20, 10)


  โจทย์ ข้อที่ 3 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน)
   1     public static int gcd(int m, int n) {                            การเรียกใช้         คําตอบ
      2              if (m < n) return gcd(n, m);
      3              if (m % n == 0) {                                                        gcd(28, 16)
      4                return n;
      5              } else {                                                                 gcd(9, 14)
      6                return gcd(n, m % n);
      7              }                                                                        gcd(75, 30)
      8       }                           เรี ยกการเวียนเกิดแบบนี ้ว่า Tail Recursion

  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้
Recursion - 11                                                            Computer Programming using Java         147
โจทย์ ข้อที่ 4 [ระดับง่ าย] จงแสดงผลลัพธ์ และรายละเอียดจากการเรียกใช้ เมท็อด expo(…) (15 คะแนน)
 1     public static int expo(int n) {                                  การเรียกใช้    คําตอบ
 2         if (n <= 0) {
 3           return 1;                                                             expo(4)
 4         } else {
 5           return expo(n - 1) + expo(n - 1);                                     expo(7)
 6         }
 7     }
                                เรี ยกการเวียนเกิดแบบนี ้ว่า Binary Recursion      expo(11)


จงแสดงรายละเอียดของต้ นไม้ แบบทวิภาค (Binary Tree) จากการเรียกใช้ expo(0), expo(1), expo(2)
และ expo(3)
     expo(0)                      expo(1)                                          expo(2)



                      expo(0)                   expo(0)
                                                                      expo(1)                     expo(1)




                                                             expo(0)            expo(0) expo(0)             expo(0)




                                                   expo(3)



                        expo(2)                                                    expo(2)




           expo(1)                    expo(1)                        expo(1)                   expo(1)




  expo(0)            expo(0) expo(0)             expo(0) expo(0)                expo(0) expo(0)             expo(0)




โจทย์ ข้อที่ 5 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน)
 1     public static void printX(int x) {                                การเรียกใช้ และคําตอบ
 2         if (x >= 1) {
 3           printX(1, x);                                                         printX(4)       printX(7)
 4         }
 5     }
 6     public static void printX(int i, int x) {
 7       if (i <= x) {
 8         System.out.print(i);
 9         printX(i + 1, x);
 10      } else {
 11        System.out.println();
 12        printX(x - 1);
 13      }
 14    }
                                เรี ยกการเวียนเกิดแบบนี ้ว่า Mutual Recursion

© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
148   Computer Programming using Java                                                                     11 - Recursion


  โจทย์ ข้อที่ 6 [ระดับปานกลาง] จงแสดงผลลัพธ์ ในตารางต่ อไปนีให้ ถกต้ อง ซึ่งเกิดจากการเรี ยกใช้ เมท็อด
                                                             ้ ู
  akm(m, n) แบบเวียนเกิด โดยกําหนดให้ ใช้ ค่าพารามิเตอร์ m และ n ตามตาราง (10 คะแนน)

      1      public static int akm(int m, int n) {
      2        if (m == 0) {                                            เรี ยกการเวียนเกิดแบบนี ้ว่า Nested Recursion
      3          return n + 1;
      4        } else if (n == 0) {
      5          return akm(m - 1, 1);                                  เป็ น Recursion ที่ไม่สามารถ
      6        } else {
      7          return akm(m - 1, akm(m, n - 1));                      เปลี่ยนเป็ น Iteration ได้ เสนอ
      8
      9      }
               }                                                        โดย Wilhelm Ackermann


                                                               พารามิเตอร์ n
      พารามิเตอร์ m
                                     0             1                2                      3                  4

               0

               1

               2

               3


  2. การเวียนเกิดแบบง่ าย (Basic Recursion)
  1. การเวียนเกิดแบบง่ าย ได้ แก่ การเวียนเกิดที่ทํางานเสร็ จสิ ้นอยูภายในเมท็อดเดียว ซึงในบทนี ้จะเน้ นการเวียน
                                                                    ่                   ่
     เกิดแบบ Linear Recursion, Tail Recursion และ Binary Recursion เป็ นหลัก
  2. ลักษณะของเมท็อดที่ปรากฎในการเวียนเกิดแบบง่ าย โดยทัวไปแล้ วจะเป็ นเมท็อดที่ใช้ หาผลลัพธ์ ทาง
                                                                        ่
     คณิตศาสตร์ เช่น อนุกรม (Series), ฟั งก์ชน (Functions) หรื อ อัลกอริทม (Algorithms) เป็ นต้ น
                                             ั                            ึ
  3. การแปลงสมการคณิตศาสตร์ ให้ เป็ นเมท็อดเวียนเกิดแบบง่ าย มีขนตอนดังนี ้ ั้
     กําหนดโจทย์ จงหาผลบวกของตัวเลขจํานวนเต็มตังแต่ 0 จนถึง n (โดยที่ n ≥ 0)
                                                          ้
     1) แปลงโจทย์ที่กําหนดให้ ให้ เป็ นสมการหรื อฟั งก์ชนทางคณิตศาสตร์ หรื อสมการในรูปทัวไปซึงจะได้
                                                        ั                                   ่ ่
                        n
             f(n) =    ∑i                    n = 0,1,2,3,…
                       i =0

          2) แยกสมการออกเป็ น 2 กรณี (หรื ออาจจะมากกว่า 2 กรณีก็ได้ ) ซึงได้ แก่
                                                                        ่
             (1) กรณีที่สมการเท่ากับค่าของพจน์แรกเพียงพจน์เดียวซึงจะได้
                                                                 ่
                   f(n) = 0                            n = 0                        1

             (2) กรณีที่สมการอยูในรูปทัวไป แต่จะดึงพจน์สดท้ ายออกมาให้ เห็นในสมการซึงจะได้
                               ่       ่                ุ                           ่
                              n −1
                   f(n) =     ∑i     + n               n = 1,2,3,…
                              i =0

                   f(n) = f(n - 1) + n                 n = 1,2,3,…                  2


  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้
Recursion - 11                                                         Computer Programming using Java      149
    3) แปลงสมการทัง้ 2 กรณีที่ได้ จากขันตอนที่ 2 ให้ เป็ นเมท็อดในภาษาจาวาโดยใช้ คําสัง if-else เพื่อระบุ
                                       ้                                                  ่
       เงื่อนไขของแต่ละกรณี ซึงจะให้ กรณีที่ 1 เป็ นกรณีฐาน และกรณีที่ 2 เป็ นกรณีเวียนเกิด
                              ่
           1       public static int f(int n) {                    1   public static int f(int n) {
           2         if(n > 0) {                                   2     if(n <= 0) {
           3           return f(n - 1) + n;                        3       return 0;
           4         } else {                                      4     } else {
           5           return 0;                                   5       return f(n - 1) + n;
           6         }                                             6     }
           7       }                   เมื่อ n มากกว่า             7   }
                                                                                   ในการเวียนเกิดแต่ละรอบ
               เมื่อ n น้ อยกว่าหรื อเท่ากับ   0 จะทําการเวียน
                                                                                   จะมีการลดค่า n ลง 1
               0 จะหยุดการเวียนเกิด            เกิด (ไปเรื่ อยๆ)


โจทย์ ข้อที่ 7 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด f(…) ที่ทางานแบบเวียนเกิด
                                                                                   ํ
โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน)
            n                                  กรณีฐาน
           ∑ i3
                  1
  f n) =
   (                       n ≥ 1
           i=1
                                               กรณีเวียนเกิด




โจทย์ ข้อที่ 8 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด f(…) ที่ทางานแบบเวียนเกิด
                                                                                   ํ
โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และอนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน)
                                                                              ⎧ n
                                                                              ∑
                                                                              ⎪ (i + 2i)
                                                                       f n) = ⎨i = 1
                                                                        (
                                                                                     i
                                                                                                    n ≥ 1
                                                                              ⎪0                    n = 0
                                                                              ⎩




© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
150   Computer Programming using Java                                                           11 - Recursion


  โจทย์ ข้อที่ 9 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด g(…) ที่ทางานแบบเวียนเกิด
                                                                                     ํ
  โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน)
                                                                           ⎧ n ⎛      1⎞
                                                                           ⎪  ∏   ⎜1 + ⎟
                                                                           ⎪i = 2 ⎝   i⎠
                                                                                                     n ≥ 2
                                                                           ⎪
                                                                    g n) = ⎨1
                                                                     (                               n = 1
                                                                           ⎪
                                                                           ⎪
                                                                           ⎪0
                                                                           ⎩                         n = 0




  โจทย์ ข้อที่ 10 [ระดับง่ าย] จงเขียนเมท็อด fac(…)แบบเวียนเกิดเพื่อคํานวณค่ าแฟกทอเรียล (Factorial)
  ของตัวเลขจํานวนเต็ม n เช่ น fac(5) คือค่ าของ 5! ซึ่งเท่ ากับ 120 เป็ นต้ น (10 คะแนน)




  โจทย์ ข้อที่ 11 [ระดับง่ าย] จงเขียนเมท็อด fibo(…) แบบเวียนเกิดเพื่อคํานวณหาคําตอบของสมการฟิ -
  โบแนคซี (Fibonacci) ซึ่งมีรูปแบบสมการเป็ นดังนี ้ fibo(n) = fibo(n - 1) + fibo(n - 2) เมื่อ
  n >= 2 โดยกําหนดให้ fibo(0) = 0 และ fibo(1) = 1 (10 คะแนน)




  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้
Recursion - 11                                                       Computer Programming using Java           151
โจทย์ ข้อที่ 12 [ระดับง่ าย] จากเมท็อด fibo(…) ในโจทย์ ด้านบนจงแสดงรายละเอียดของต้ นไม้ แบบทวิ-
ภาค (Binary Tree) ในการหาค่ า fibo(5) (5 คะแนน) fibo(5)
                                  fibo(4)                                            fibo(3)



                   fibo(3)                       fibo(2)                   fibo(2)              fibo(1)



         fibo(2)             fibo(1)   fibo(1)             fibo(0)    fibo(1)         fibo(0)



  fibo(1)           fibo(0)




โจทย์ ข้อที่ 13 [ระดับปานกลาง] จงเขียนเมท็อด pow(…) แบบเวียนเกิดเพื่อคํานวณหาค่ ายกกําลังของ ab
โดยกําหนดให้ a เป็ นจํานวนจริง และ b เป็ นจํานวนเต็มใดๆ (เต็มบวก เต็มลบ เต็มศนย์ ) (10 คะแนน)
                                                                             ู
                                                                        ไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math




โจทย์ ข้อที่ 14 [ระดับยาก] จงเขียนเมท็อด f(…)แบบเวียนเกิดจากสมการต่ อไปนี ้ โดยให้ รับค่ า n เข้ ามา
ทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน)
                                                                                              n
                                                                        f n) = 1 +
                                                                         (
                                                                                              n − 1
                                                                                     1 +
                                                                                                n − 2
                                                                                         1 +
                                                                                                  n − 3
                                                                                             1 +
                                                                                                      O
                                                                                                 1 +
                                                                                                      1




© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
152    Computer Programming using Java                                                          11 - Recursion


  โจทย์ ข้อที่ 15 [ระดับยาก] จงพิจารณาสมการที่กําหนดให้ ต่อไปนี ้ เพื่อเขียนเป็ นเมท็อดที่มีการทํางาน
  แบบเวียนเกิด โดยให้ รับค่ าตัวแปรที่ใช้ ในการคํานวณเข้ ามาทางพารามิเตอร์ (20 คะแนน)
  1) g(n, m) = 1m - 2m + 3m - … + (nm)                    n = 1,2,3,… (10 คะแนน)

                                                                           อนุญาตให้ ใช้ เมท็อดจากคลาส Math




                     1   1   1         1
  2)    h(n) = 1 +     −   +   − ... +                n = 1,2,3,…       (10 คะแนน)
                     2   3   4         n
                                                                         ไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math




  3. การเวียนเกิดแบบซับซ้ อน (Advanced Recursion)
  1. การเวียนเกิดแบบซับซ้ อน ได้ แก่
     การเวียนเกิดที่ใช้ เมท็อดตังแต่ 2 เมท็อดขึ ้นไปในการทํางาน (เมท็อดมีการ Overload กัน) ซึงในบทนี ้จะเน้ น
                                ้                                                            ่
     การเวียนเกิดแบบ Mutual Recursion เป็ นหลัก
  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้
Recursion - 11                                                          Computer Programming using Java             153
2. ลักษณะของเมท็อดที่ปรากฎในการเวียนเกิดแบบซับซ้ อน โดยทัวไปแล้ วจะเป็ นเมท็อดที่ใช้ ประมวลผล
                                                                    ่
   เกี่ยวกับสตริ ง (String) และอาเรย์ (Arrays) ดังตัวอย่างต่อไปนี ้
      1     public static int max(int a[]) {
      2       return max(a, 0, a[0]);                               เมท็อด   max(…) มีการ Overload กัน
      3     }
      4
      5     public static int max(int a[], int i, int m) {
      6       if (i < a.length) {
      7         if (a[i] > m) m = a[i];            เมท็อด max(…) ใช้ หาค่าสมาชิกที่มากที่สดใน
                                                                                           ุ
      8         return max(a, i + 1, m);
      9       } else {                             อาเรย์ โดยเมท็อด max(…) ด้ านบนจะรับอาเรย์
      10        return m;
      11      }                                    เข้ ามาแล้ วส่งต่อไปให้ กบเมท็อด max(…) ด้ าน-
                                                                            ั
      12    }
                                                                    ล่างเพื่อเวียนเกิด (Indirect Recursion)

3. หลักการเขียนเมท็อดเวียนเกิดแบบซับซ้ อน
   การเขียนเมท็อดเวียนเกิดแบบซับซ้ อนจะต้ องเขียนเมท็อดหลายเมท็อดที่ Overload กันเสมอ เพราะเนื่องจาก
   เมท็อดเวียนเกิดตัวแรกที่ประมวลผลอาจต้ องใช้ ตวแปรหรื อค่าบางค่าเพิ่มเติมภายในเมท็อด และค่าเหล่านัน
                                                    ั                                                               ้
   จะต้ องนํากลับไปใช้ ต่อเนื่องในรอบต่อๆ ไปอีกด้ วย เช่น ค่าตําแหน่งปั จจุบนในอาเรย์ เป็ นต้ น ดังนันจึงต้ องส่ง
                                                                               ั                       ้
   ค่าทุกค่าผ่านไปยังพารามิเตอร์ เราจึงจําเป็ นต้ องสร้ างเมท็อดตัวที่สองขึ ้นมาที่ Overload กับตัวแรก เพื่อให้
   สามารถส่งค่าทุกค่าที่ต้องใช้ งานผ่านไปยังพารามิเตอร์ ได้ ครบถ้ วน แล้ วให้ ทําการเวียนเกิดที่เมท็อดตัวที่สองนี ้

โจทย์ ข้อที่ 16 [ระดับปานกลาง] จงเขียนเมท็อด search(…) แบบเวียนเกิดเพื่อค้ นหาตําแหน่ งสมาชิกใน
อาเรย์ ท่ ีมีค่าเท่ ากับจํานวนเต็มที่รับเข้ ามา ถ้ าค้ นเจอให้ คืนค่ าตําแหน่ งสมาชิกที่เจอ แต่ ถ้าไม่ เช่ นนันให้
                                                                                                              ้
คืนค่ า -1 (10 คะแนน)




© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
154   Computer Programming using Java                                                           11 - Recursion


  โจทย์ ข้อที่ 17 [ระดับปานกลาง] จงเขียนเมท็อด overHundred(…) แบบเวียนเกิดเพื่อนับตัวเลขจํานวน
  เต็มที่มีค่ามากกว่ า 100 ในอาเรย์ d ที่รับเข้ ามาว่ ามีก่ ีจานวน (10 คะแนน)
                                                              ํ
  public class OverHundredNumber {
    public static void main(String[] args) {
      int d[] = { 99, 101, 13, 78, 200, 534, 47, 1234, 736 };
      System.out.println(overHundred(d));
    }




  } //End of class


  โจทย์ ข้อที่ 18 [ระดับปานกลาง] จงเขียนเมท็อด revStr(…) แบบเวียนเกิดเพื่อกลับตําแหน่ งของอักขระ
  ทุกตัวในสตริงจากหลังมาหน้ า เช่ น สตริง "Computer" จะได้ เป็ น "retupmoC" เป็ นต้ น (10 คะแนน)




  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้
Recursion - 11                                                     Computer Programming using Java          155
โจทย์ ข้อที่ 19 [ระดับยาก] จงเขียนเมท็อด formulaAtoB(…)แบบเวียนเกิดเพื่อพิมพ์ สูตรคณตังแม่ a
                                                                                          ู ้
จนถึงแม่ b ซึ่งรั บเข้ ามาทางพารามิเตอร์ เช่ น formulaAtoB(6, 15) จะได้ สูตรคณตังแต่ แม่ 6 ถึงแม่ 15
                                                                             ู ้
เป็ นต้ น (10 คะแนน)




โจทย์ ข้อที่ 20 [ระดับยาก] จงเขียนเมท็อด addArray(…) แบบเวียนเกิดเพื่อใช้ สําหรั บหาผลบวกระหว่ าง
อาเรย์ หนึ่งมิติ 2 ชุดใดๆ ที่มีจานวนสมาชิกเท่ ากัน แล้ วคืนค่ ากลับ (10 คะแนน)
                                ํ




© สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                            ้
156   Computer Programming using Java                                                           11 - Recursion


  โจทย์ ข้อที่ 21 [ระดับยาก] จงเขียนเมท็อด isMatrixEquals(…) แบบเวียนเกิดเพื่อรั บเมตริ กซ์ ชนิด
  จํานวนเต็มเข้ ามา 2 ตัวเพื่อตรวจสอบว่ าเมตริ กซ์ ทังสองเท่ ากันหรื อไม่ โดยขนาดจะต้ องเท่ ากันทังแถว
                                                     ้                                            ้
  และหลัก และสมาชิกทุกในตําแหน่ งที่ตรงกันต้ องมีค่าเท่ ากัน (10 คะแนน)




  © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์)
                                              ้

Weitere ähnliche Inhalte

Was ist angesagt?

Java-Answer Chapter 10-11 (For Print)
Java-Answer Chapter 10-11 (For Print)Java-Answer Chapter 10-11 (For Print)
Java-Answer Chapter 10-11 (For Print)
Wongyos Keardsri
 
Java-Answer Chapter 07 (For Print)
Java-Answer Chapter 07 (For Print)Java-Answer Chapter 07 (For Print)
Java-Answer Chapter 07 (For Print)
Wongyos Keardsri
 
Java-Answer Chapter 05-06 (For Print)
Java-Answer Chapter 05-06 (For Print)Java-Answer Chapter 05-06 (For Print)
Java-Answer Chapter 05-06 (For Print)
Wongyos Keardsri
 
Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)
Wongyos Keardsri
 
Java-Answer Chapter 08-09 (For Print)
Java-Answer Chapter 08-09 (For Print)Java-Answer Chapter 08-09 (For Print)
Java-Answer Chapter 08-09 (For Print)
Wongyos Keardsri
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
Finian Nian
 
Discrete-Chapter 09 Algorithms
Discrete-Chapter 09 AlgorithmsDiscrete-Chapter 09 Algorithms
Discrete-Chapter 09 Algorithms
Wongyos Keardsri
 
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญาสูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
Kanomwan Jeab
 
บทที่ 5 คลาส
บทที่ 5 คลาสบทที่ 5 คลาส
บทที่ 5 คลาส
Theeravaj Tum
 
อนุพันธ์
อนุพันธ์อนุพันธ์
อนุพันธ์
krurutsamee
 

Was ist angesagt? (20)

Java-Answer Chapter 10-11 (For Print)
Java-Answer Chapter 10-11 (For Print)Java-Answer Chapter 10-11 (For Print)
Java-Answer Chapter 10-11 (For Print)
 
Java-Answer Chapter 07 (For Print)
Java-Answer Chapter 07 (For Print)Java-Answer Chapter 07 (For Print)
Java-Answer Chapter 07 (For Print)
 
Java-Answer Chapter 05-06 (For Print)
Java-Answer Chapter 05-06 (For Print)Java-Answer Chapter 05-06 (For Print)
Java-Answer Chapter 05-06 (For Print)
 
Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)Java-Answer Chapter 12-13 (For Print)
Java-Answer Chapter 12-13 (For Print)
 
Java-Answer Chapter 08-09 (For Print)
Java-Answer Chapter 08-09 (For Print)Java-Answer Chapter 08-09 (For Print)
Java-Answer Chapter 08-09 (For Print)
 
Java-Chapter 13 Advanced Classes and Objects
Java-Chapter 13 Advanced Classes and ObjectsJava-Chapter 13 Advanced Classes and Objects
Java-Chapter 13 Advanced Classes and Objects
 
Java-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and ObjectsJava-Chapter 12 Classes and Objects
Java-Chapter 12 Classes and Objects
 
Java-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingJava-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java Programming
 
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้นคลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
 
Discrete-Chapter 09 Algorithms
Discrete-Chapter 09 AlgorithmsDiscrete-Chapter 09 Algorithms
Discrete-Chapter 09 Algorithms
 
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญาสูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
สูตรอนุพันธ์ของฟังก์ชัน อนินท์ญา
 
ค่าสูงสุดสัมบูรณ์และค่าต่ำสุดสัมบูรณ์ของฟังก์ชัน
ค่าสูงสุดสัมบูรณ์และค่าต่ำสุดสัมบูรณ์ของฟังก์ชันค่าสูงสุดสัมบูรณ์และค่าต่ำสุดสัมบูรณ์ของฟังก์ชัน
ค่าสูงสุดสัมบูรณ์และค่าต่ำสุดสัมบูรณ์ของฟังก์ชัน
 
บทที่ 5 คลาส
บทที่ 5 คลาสบทที่ 5 คลาส
บทที่ 5 คลาส
 
6.Flow control
6.Flow control6.Flow control
6.Flow control
 
Java-Chapter 10 Two Dimensional Arrays
Java-Chapter 10 Two Dimensional ArraysJava-Chapter 10 Two Dimensional Arrays
Java-Chapter 10 Two Dimensional Arrays
 
อนุพันธ์
อนุพันธ์อนุพันธ์
อนุพันธ์
 
ปริพันธ์
ปริพันธ์ปริพันธ์
ปริพันธ์
 
Java Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and CollectionJava Programming [8/12] : Arrays and Collection
Java Programming [8/12] : Arrays and Collection
 
Java Programming: โครงสร้างควบคุม
Java Programming: โครงสร้างควบคุมJava Programming: โครงสร้างควบคุม
Java Programming: โครงสร้างควบคุม
 
Java Programming: อะเรย์และคอลเล็กชั่น
Java Programming: อะเรย์และคอลเล็กชั่นJava Programming: อะเรย์และคอลเล็กชั่น
Java Programming: อะเรย์และคอลเล็กชั่น
 

Andere mochten auch

การเขียนคำสังควบคุมขั้นพื้นฐาน 2
การเขียนคำสังควบคุมขั้นพื้นฐาน 2การเขียนคำสังควบคุมขั้นพื้นฐาน 2
การเขียนคำสังควบคุมขั้นพื้นฐาน 2
Tay Atcharawan
 

Andere mochten auch (12)

How to Study and Research in Computer-related Master Program
How to Study and Research in Computer-related Master ProgramHow to Study and Research in Computer-related Master Program
How to Study and Research in Computer-related Master Program
 
การเขียนคำสังควบคุมขั้นพื้นฐาน 2
การเขียนคำสังควบคุมขั้นพื้นฐาน 2การเขียนคำสังควบคุมขั้นพื้นฐาน 2
การเขียนคำสังควบคุมขั้นพื้นฐาน 2
 
Java ug
Java ugJava ug
Java ug
 
Unit02
Unit02Unit02
Unit02
 
Java-Chapter 07 One Dimensional Arrays
Java-Chapter 07 One Dimensional ArraysJava-Chapter 07 One Dimensional Arrays
Java-Chapter 07 One Dimensional Arrays
 
Java-Chapter 04 Iteration Statements
Java-Chapter 04 Iteration StatementsJava-Chapter 04 Iteration Statements
Java-Chapter 04 Iteration Statements
 
Java-Chapter 06 File Operations
Java-Chapter 06 File OperationsJava-Chapter 06 File Operations
Java-Chapter 06 File Operations
 
Java-Chapter 09 Advanced Statements and Applications
Java-Chapter 09 Advanced Statements and ApplicationsJava-Chapter 09 Advanced Statements and Applications
Java-Chapter 09 Advanced Statements and Applications
 
Java-Chapter 05 String Operations
Java-Chapter 05 String OperationsJava-Chapter 05 String Operations
Java-Chapter 05 String Operations
 
Java-Chapter 02 Data Operations and Processing
Java-Chapter 02 Data Operations and ProcessingJava-Chapter 02 Data Operations and Processing
Java-Chapter 02 Data Operations and Processing
 
IP address anonymization
IP address anonymizationIP address anonymization
IP address anonymization
 
การควบคุมทิศทางการทำงานของโปรแกรม
การควบคุมทิศทางการทำงานของโปรแกรมการควบคุมทิศทางการทำงานของโปรแกรม
การควบคุมทิศทางการทำงานของโปรแกรม
 

Mehr von Wongyos Keardsri

SysProg-Tutor 03 Unix Shell Script Programming
SysProg-Tutor 03 Unix Shell Script ProgrammingSysProg-Tutor 03 Unix Shell Script Programming
SysProg-Tutor 03 Unix Shell Script Programming
Wongyos Keardsri
 
SysProg-Tutor 02 Introduction to Unix Operating System
SysProg-Tutor 02 Introduction to Unix Operating SystemSysProg-Tutor 02 Introduction to Unix Operating System
SysProg-Tutor 02 Introduction to Unix Operating System
Wongyos Keardsri
 
SysProg-Tutor 01 Introduction to C Programming Language
SysProg-Tutor 01 Introduction to C Programming LanguageSysProg-Tutor 01 Introduction to C Programming Language
SysProg-Tutor 01 Introduction to C Programming Language
Wongyos Keardsri
 
Discrete-Chapter 11 Graphs Part III
Discrete-Chapter 11 Graphs Part IIIDiscrete-Chapter 11 Graphs Part III
Discrete-Chapter 11 Graphs Part III
Wongyos Keardsri
 
Discrete-Chapter 11 Graphs Part II
Discrete-Chapter 11 Graphs Part IIDiscrete-Chapter 11 Graphs Part II
Discrete-Chapter 11 Graphs Part II
Wongyos Keardsri
 
Discrete-Chapter 11 Graphs Part I
Discrete-Chapter 11 Graphs Part IDiscrete-Chapter 11 Graphs Part I
Discrete-Chapter 11 Graphs Part I
Wongyos Keardsri
 
Discrete-Chapter 08 Relations
Discrete-Chapter 08 RelationsDiscrete-Chapter 08 Relations
Discrete-Chapter 08 Relations
Wongyos Keardsri
 
Discrete-Chapter 07 Probability
Discrete-Chapter 07 ProbabilityDiscrete-Chapter 07 Probability
Discrete-Chapter 07 Probability
Wongyos Keardsri
 
Discrete-Chapter 06 Counting
Discrete-Chapter 06 CountingDiscrete-Chapter 06 Counting
Discrete-Chapter 06 Counting
Wongyos Keardsri
 
Discrete-Chapter 05 Inference and Proofs
Discrete-Chapter 05 Inference and ProofsDiscrete-Chapter 05 Inference and Proofs
Discrete-Chapter 05 Inference and Proofs
Wongyos Keardsri
 
Discrete-Chapter 04 Logic Part II
Discrete-Chapter 04 Logic Part IIDiscrete-Chapter 04 Logic Part II
Discrete-Chapter 04 Logic Part II
Wongyos Keardsri
 
Discrete-Chapter 04 Logic Part I
Discrete-Chapter 04 Logic Part IDiscrete-Chapter 04 Logic Part I
Discrete-Chapter 04 Logic Part I
Wongyos Keardsri
 
Discrete-Chapter 03 Matrices
Discrete-Chapter 03 MatricesDiscrete-Chapter 03 Matrices
Discrete-Chapter 03 Matrices
Wongyos Keardsri
 
Discrete-Chapter 02 Functions and Sequences
Discrete-Chapter 02 Functions and SequencesDiscrete-Chapter 02 Functions and Sequences
Discrete-Chapter 02 Functions and Sequences
Wongyos Keardsri
 
Discrete-Chapter 12 Modeling Computation
Discrete-Chapter 12 Modeling ComputationDiscrete-Chapter 12 Modeling Computation
Discrete-Chapter 12 Modeling Computation
Wongyos Keardsri
 

Mehr von Wongyos Keardsri (19)

The next generation intelligent transport systems: standards and applications
The next generation intelligent transport systems: standards and applicationsThe next generation intelligent transport systems: standards and applications
The next generation intelligent transport systems: standards and applications
 
SysProg-Tutor 03 Unix Shell Script Programming
SysProg-Tutor 03 Unix Shell Script ProgrammingSysProg-Tutor 03 Unix Shell Script Programming
SysProg-Tutor 03 Unix Shell Script Programming
 
SysProg-Tutor 02 Introduction to Unix Operating System
SysProg-Tutor 02 Introduction to Unix Operating SystemSysProg-Tutor 02 Introduction to Unix Operating System
SysProg-Tutor 02 Introduction to Unix Operating System
 
SysProg-Tutor 01 Introduction to C Programming Language
SysProg-Tutor 01 Introduction to C Programming LanguageSysProg-Tutor 01 Introduction to C Programming Language
SysProg-Tutor 01 Introduction to C Programming Language
 
Discrete-Chapter 11 Graphs Part III
Discrete-Chapter 11 Graphs Part IIIDiscrete-Chapter 11 Graphs Part III
Discrete-Chapter 11 Graphs Part III
 
Discrete-Chapter 11 Graphs Part II
Discrete-Chapter 11 Graphs Part IIDiscrete-Chapter 11 Graphs Part II
Discrete-Chapter 11 Graphs Part II
 
Discrete-Chapter 11 Graphs Part I
Discrete-Chapter 11 Graphs Part IDiscrete-Chapter 11 Graphs Part I
Discrete-Chapter 11 Graphs Part I
 
Discrete-Chapter 10 Trees
Discrete-Chapter 10 TreesDiscrete-Chapter 10 Trees
Discrete-Chapter 10 Trees
 
Discrete-Chapter 08 Relations
Discrete-Chapter 08 RelationsDiscrete-Chapter 08 Relations
Discrete-Chapter 08 Relations
 
Discrete-Chapter 07 Probability
Discrete-Chapter 07 ProbabilityDiscrete-Chapter 07 Probability
Discrete-Chapter 07 Probability
 
Discrete-Chapter 06 Counting
Discrete-Chapter 06 CountingDiscrete-Chapter 06 Counting
Discrete-Chapter 06 Counting
 
Discrete-Chapter 05 Inference and Proofs
Discrete-Chapter 05 Inference and ProofsDiscrete-Chapter 05 Inference and Proofs
Discrete-Chapter 05 Inference and Proofs
 
Discrete-Chapter 04 Logic Part II
Discrete-Chapter 04 Logic Part IIDiscrete-Chapter 04 Logic Part II
Discrete-Chapter 04 Logic Part II
 
Discrete-Chapter 04 Logic Part I
Discrete-Chapter 04 Logic Part IDiscrete-Chapter 04 Logic Part I
Discrete-Chapter 04 Logic Part I
 
Discrete-Chapter 03 Matrices
Discrete-Chapter 03 MatricesDiscrete-Chapter 03 Matrices
Discrete-Chapter 03 Matrices
 
Discrete-Chapter 02 Functions and Sequences
Discrete-Chapter 02 Functions and SequencesDiscrete-Chapter 02 Functions and Sequences
Discrete-Chapter 02 Functions and Sequences
 
Discrete-Chapter 01 Sets
Discrete-Chapter 01 SetsDiscrete-Chapter 01 Sets
Discrete-Chapter 01 Sets
 
Discrete-Chapter 12 Modeling Computation
Discrete-Chapter 12 Modeling ComputationDiscrete-Chapter 12 Modeling Computation
Discrete-Chapter 12 Modeling Computation
 
Java-Chapter 14 Creating Graphics with DWindow
Java-Chapter 14 Creating Graphics with DWindowJava-Chapter 14 Creating Graphics with DWindow
Java-Chapter 14 Creating Graphics with DWindow
 

Java-Chapter 11 Recursions

  • 1. Recursion - 11 Computer Programming using Java 145 CHAPTER การเวียนเกิด 11 (Recursion) 1. ความร้ ูเบืองต้ นเกี่ยวกับการเวียนเกิด (Introduction to Recursion) ้ 1. นิยามของการเวียนเกิด 1) การเวียนเกิด (Recursion) คือ ปรากฏการณ์ที่มีการวนกลับไปอ้ างอิงถึง ตัว เองซํ า แล้ ว ซํ ้าเล่า แบบไม่ร้ ูจ บ ซึ่ง มี ป รากฎอยู่ใ นหลายๆ วงการ เช่ น ้ ศิลปะ ดนตรี คณิตศาสตร์ และรวมถึงคอมพิวเตอร์ อีกด้ วย ในภาษาจาวา นันการเวียนเกิดจะเกิดขึ ้นได้ กบเมท็อด ้ ั 2) เมท็อดแบบเวียนเกิด (Recursive Method) คือ เมท็อดที่เรี ยกใช้ เมท็อด ตัวเองซํ ้าภายในเมท็อดนั ้น (จะทําหน้ าที่เป็ นทังผู้เรี ยกและผู้ที่ถกเรี ยกใน ้ ู เวลาเดียวกันกับเมท็อดตัวเดียวกัน) ซึงจะมีกระบวนการทํางานทุกอย่าง ่ เหมือนกับการวนซํ ้า (Iteration) ในบทที่ 4 ทุกประการแต่จะไม่มีคําสัง ่ while หรื อ for ที่กล่าวไว้ ในบทที่ 4 ปรากฎอยูเลย ่ 3) การเขียนโปรแกรมแบบเวียนเกิด (Recursive Programming) คือ การ Droste Effect คือภาพที่ปรา- กฏการเวียนเกิดภายในภาพ เขียนโปรแกรมโดยให้ เมท็อดใดเมท็อดหนึ่งหรื อหลายเมท็อด เรี ยกใช้ เม- ท็อดตัวเองซํ ้าภายในเมท็อดนันไปเรื่ อยๆ จนกว่าจะหลุดพ้ นจาก เงื่อนไขหรื อสิ ้นสุดการเวียนเกิด ้ 2. ขันตอนการทํางานของเมท็อดแบบเวียนเกิด จะประกอบไปด้ วย 2 กรณี คือ ้ 1) กรณีเวียนเกิด (Recursion Case) เป็ นกรณีที่เมท็อดคืนค่าที่เกิดจากการเรี ยกใช้ งานเมท็อดตัวมันเอง เช่น return fac(n-1), return fibo(n-1) + fibo(n-2) เป็ นต้ น ซึงเสมือนเป็ นการเรี ยกซํ ้า ่ เมท็อดตัวเองอีกครังอยู่ภายในเมท็อดนัน โดยเมท็อดจะเรี ยกซํ ้าแบบนี ้ไปเรื่ อยๆ จนกว่าจะเข้ าสูกรณีฐาน ้ ้ ่ จึงจะหยุดการเรี ยกซํ ้า 2) กรณีฐาน (Base Case) เป็ นกรณีสิ ้นสุดการเวียนเกิด หรื อกรณีที่เมท็อดสามารถทํางานเสร็ จได้ ทนทีโดย ั ไม่ต้องมีการเรี ยกซํ ้าอีก ซึงเมท็อดจะคืนค่าคงที่คาใดค่าหนึงออกมา เช่น return 1, return n เป็ นต้ น ่ ่ ่ 3. ตัวอย่ างเมท็อดแบบเวียนเกิด กําหนดให้ เมท็อด f(…) ใช้ หาผลบวกของตัวเลขจํานวนเต็มตังแต่ 0 จนถึง n โดยที่ f(n) = (0+1+2+ ้ … +n) ใช้ หลักการวนซํา (Iteration: for) ้ ใช้ หลักการเวียนเกิด (Recursion) 1 public static int f(int n) { 1 public static int f(int n) { 2 int s = 0; 2 if(n <= 0) { 3 for(int i = n; i >= 0; i--) { 3 return 0; กรณีฐาน 4 s += i; 4 } else { 5 } 5 return f(n - 1) + n; 6 return s; วนกลับหลัง 6 } 7 } 7 } กรณีเวียนเกิด © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 2. 146 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 1 [ระดับง่ าย] จากการทํางานแบบเวียนเกิดของเมท็อด f(…) ก่ อนหน้ านี ้ จงแสดงรายละเอียด การทํางานของเมท็อดดังกล่ าวเมื่อเรี ยกใช้ f(5) (10 คะแนน) เรี ยก เรี ยก เรี ยก เรี ยก เรี ยก เรี ยก ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ เวียนเข้ า รอบที่ 1 รอบที่ 2 รอบที่ 3 รอบที่ 4 รอบที่ 5 รอบที่ 6 คืนค่ า คืนค่ า คืนค่ า คืนค่ า คืนค่ า คืนค่ า ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ ผลลัพธ์ เวียนออก รอบที่ 1 รอบที่ 2 รอบที่ 3 รอบที่ 4 รอบที่ 5 รอบที่ 6 โจทย์ ข้อที่ 2 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน) 1 public static int mul(int x, int y) { การเรียกใช้ คําตอบ 2 if (x >= 1) { 3 return y + mul(x - 1, y); mul(4, 3) 4 } else { 5 return 0; mul(5, 7) 6 } 7 } เรี ยกการเวียนเกิดแบบนี ้ว่า Linear Recursion mul(20, 10) โจทย์ ข้อที่ 3 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน) 1 public static int gcd(int m, int n) { การเรียกใช้ คําตอบ 2 if (m < n) return gcd(n, m); 3 if (m % n == 0) { gcd(28, 16) 4 return n; 5 } else { gcd(9, 14) 6 return gcd(n, m % n); 7 } gcd(75, 30) 8 } เรี ยกการเวียนเกิดแบบนี ้ว่า Tail Recursion © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 3. Recursion - 11 Computer Programming using Java 147 โจทย์ ข้อที่ 4 [ระดับง่ าย] จงแสดงผลลัพธ์ และรายละเอียดจากการเรียกใช้ เมท็อด expo(…) (15 คะแนน) 1 public static int expo(int n) { การเรียกใช้ คําตอบ 2 if (n <= 0) { 3 return 1; expo(4) 4 } else { 5 return expo(n - 1) + expo(n - 1); expo(7) 6 } 7 } เรี ยกการเวียนเกิดแบบนี ้ว่า Binary Recursion expo(11) จงแสดงรายละเอียดของต้ นไม้ แบบทวิภาค (Binary Tree) จากการเรียกใช้ expo(0), expo(1), expo(2) และ expo(3) expo(0) expo(1) expo(2) expo(0) expo(0) expo(1) expo(1) expo(0) expo(0) expo(0) expo(0) expo(3) expo(2) expo(2) expo(1) expo(1) expo(1) expo(1) expo(0) expo(0) expo(0) expo(0) expo(0) expo(0) expo(0) expo(0) โจทย์ ข้อที่ 5 [ระดับง่ าย] จงแสดงผลลัพธ์ จากการเรียกใช้ เมท็อดแบบเวียนเกิดต่ อไปนี ้ (6 คะแนน) 1 public static void printX(int x) { การเรียกใช้ และคําตอบ 2 if (x >= 1) { 3 printX(1, x); printX(4) printX(7) 4 } 5 } 6 public static void printX(int i, int x) { 7 if (i <= x) { 8 System.out.print(i); 9 printX(i + 1, x); 10 } else { 11 System.out.println(); 12 printX(x - 1); 13 } 14 } เรี ยกการเวียนเกิดแบบนี ้ว่า Mutual Recursion © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 4. 148 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 6 [ระดับปานกลาง] จงแสดงผลลัพธ์ ในตารางต่ อไปนีให้ ถกต้ อง ซึ่งเกิดจากการเรี ยกใช้ เมท็อด ้ ู akm(m, n) แบบเวียนเกิด โดยกําหนดให้ ใช้ ค่าพารามิเตอร์ m และ n ตามตาราง (10 คะแนน) 1 public static int akm(int m, int n) { 2 if (m == 0) { เรี ยกการเวียนเกิดแบบนี ้ว่า Nested Recursion 3 return n + 1; 4 } else if (n == 0) { 5 return akm(m - 1, 1); เป็ น Recursion ที่ไม่สามารถ 6 } else { 7 return akm(m - 1, akm(m, n - 1)); เปลี่ยนเป็ น Iteration ได้ เสนอ 8 9 } } โดย Wilhelm Ackermann พารามิเตอร์ n พารามิเตอร์ m 0 1 2 3 4 0 1 2 3 2. การเวียนเกิดแบบง่ าย (Basic Recursion) 1. การเวียนเกิดแบบง่ าย ได้ แก่ การเวียนเกิดที่ทํางานเสร็ จสิ ้นอยูภายในเมท็อดเดียว ซึงในบทนี ้จะเน้ นการเวียน ่ ่ เกิดแบบ Linear Recursion, Tail Recursion และ Binary Recursion เป็ นหลัก 2. ลักษณะของเมท็อดที่ปรากฎในการเวียนเกิดแบบง่ าย โดยทัวไปแล้ วจะเป็ นเมท็อดที่ใช้ หาผลลัพธ์ ทาง ่ คณิตศาสตร์ เช่น อนุกรม (Series), ฟั งก์ชน (Functions) หรื อ อัลกอริทม (Algorithms) เป็ นต้ น ั ึ 3. การแปลงสมการคณิตศาสตร์ ให้ เป็ นเมท็อดเวียนเกิดแบบง่ าย มีขนตอนดังนี ้ ั้ กําหนดโจทย์ จงหาผลบวกของตัวเลขจํานวนเต็มตังแต่ 0 จนถึง n (โดยที่ n ≥ 0) ้ 1) แปลงโจทย์ที่กําหนดให้ ให้ เป็ นสมการหรื อฟั งก์ชนทางคณิตศาสตร์ หรื อสมการในรูปทัวไปซึงจะได้ ั ่ ่ n f(n) = ∑i n = 0,1,2,3,… i =0 2) แยกสมการออกเป็ น 2 กรณี (หรื ออาจจะมากกว่า 2 กรณีก็ได้ ) ซึงได้ แก่ ่ (1) กรณีที่สมการเท่ากับค่าของพจน์แรกเพียงพจน์เดียวซึงจะได้ ่ f(n) = 0 n = 0 1 (2) กรณีที่สมการอยูในรูปทัวไป แต่จะดึงพจน์สดท้ ายออกมาให้ เห็นในสมการซึงจะได้ ่ ่ ุ ่ n −1 f(n) = ∑i + n n = 1,2,3,… i =0 f(n) = f(n - 1) + n n = 1,2,3,… 2 © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 5. Recursion - 11 Computer Programming using Java 149 3) แปลงสมการทัง้ 2 กรณีที่ได้ จากขันตอนที่ 2 ให้ เป็ นเมท็อดในภาษาจาวาโดยใช้ คําสัง if-else เพื่อระบุ ้ ่ เงื่อนไขของแต่ละกรณี ซึงจะให้ กรณีที่ 1 เป็ นกรณีฐาน และกรณีที่ 2 เป็ นกรณีเวียนเกิด ่ 1 public static int f(int n) { 1 public static int f(int n) { 2 if(n > 0) { 2 if(n <= 0) { 3 return f(n - 1) + n; 3 return 0; 4 } else { 4 } else { 5 return 0; 5 return f(n - 1) + n; 6 } 6 } 7 } เมื่อ n มากกว่า 7 } ในการเวียนเกิดแต่ละรอบ เมื่อ n น้ อยกว่าหรื อเท่ากับ 0 จะทําการเวียน จะมีการลดค่า n ลง 1 0 จะหยุดการเวียนเกิด เกิด (ไปเรื่ อยๆ) โจทย์ ข้อที่ 7 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด f(…) ที่ทางานแบบเวียนเกิด ํ โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน) n กรณีฐาน ∑ i3 1 f n) = ( n ≥ 1 i=1 กรณีเวียนเกิด โจทย์ ข้อที่ 8 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด f(…) ที่ทางานแบบเวียนเกิด ํ โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และอนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน) ⎧ n ∑ ⎪ (i + 2i) f n) = ⎨i = 1 ( i n ≥ 1 ⎪0 n = 0 ⎩ © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 6. 150 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 9 [ระดับง่ าย] จงพิจารณาสมการต่ อไปนีเ้ พื่อเขียนเป็ นเมท็อด g(…) ที่ทางานแบบเวียนเกิด ํ โดยให้ รับค่ า n เข้ ามาทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน) ⎧ n ⎛ 1⎞ ⎪ ∏ ⎜1 + ⎟ ⎪i = 2 ⎝ i⎠ n ≥ 2 ⎪ g n) = ⎨1 ( n = 1 ⎪ ⎪ ⎪0 ⎩ n = 0 โจทย์ ข้อที่ 10 [ระดับง่ าย] จงเขียนเมท็อด fac(…)แบบเวียนเกิดเพื่อคํานวณค่ าแฟกทอเรียล (Factorial) ของตัวเลขจํานวนเต็ม n เช่ น fac(5) คือค่ าของ 5! ซึ่งเท่ ากับ 120 เป็ นต้ น (10 คะแนน) โจทย์ ข้อที่ 11 [ระดับง่ าย] จงเขียนเมท็อด fibo(…) แบบเวียนเกิดเพื่อคํานวณหาคําตอบของสมการฟิ - โบแนคซี (Fibonacci) ซึ่งมีรูปแบบสมการเป็ นดังนี ้ fibo(n) = fibo(n - 1) + fibo(n - 2) เมื่อ n >= 2 โดยกําหนดให้ fibo(0) = 0 และ fibo(1) = 1 (10 คะแนน) © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 7. Recursion - 11 Computer Programming using Java 151 โจทย์ ข้อที่ 12 [ระดับง่ าย] จากเมท็อด fibo(…) ในโจทย์ ด้านบนจงแสดงรายละเอียดของต้ นไม้ แบบทวิ- ภาค (Binary Tree) ในการหาค่ า fibo(5) (5 คะแนน) fibo(5) fibo(4) fibo(3) fibo(3) fibo(2) fibo(2) fibo(1) fibo(2) fibo(1) fibo(1) fibo(0) fibo(1) fibo(0) fibo(1) fibo(0) โจทย์ ข้อที่ 13 [ระดับปานกลาง] จงเขียนเมท็อด pow(…) แบบเวียนเกิดเพื่อคํานวณหาค่ ายกกําลังของ ab โดยกําหนดให้ a เป็ นจํานวนจริง และ b เป็ นจํานวนเต็มใดๆ (เต็มบวก เต็มลบ เต็มศนย์ ) (10 คะแนน) ู ไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math โจทย์ ข้อที่ 14 [ระดับยาก] จงเขียนเมท็อด f(…)แบบเวียนเกิดจากสมการต่ อไปนี ้ โดยให้ รับค่ า n เข้ ามา ทางพารามิเตอร์ และไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math (10 คะแนน) n f n) = 1 + ( n − 1 1 + n − 2 1 + n − 3 1 + O 1 + 1 © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 8. 152 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 15 [ระดับยาก] จงพิจารณาสมการที่กําหนดให้ ต่อไปนี ้ เพื่อเขียนเป็ นเมท็อดที่มีการทํางาน แบบเวียนเกิด โดยให้ รับค่ าตัวแปรที่ใช้ ในการคํานวณเข้ ามาทางพารามิเตอร์ (20 คะแนน) 1) g(n, m) = 1m - 2m + 3m - … + (nm) n = 1,2,3,… (10 คะแนน) อนุญาตให้ ใช้ เมท็อดจากคลาส Math 1 1 1 1 2) h(n) = 1 + − + − ... + n = 1,2,3,… (10 คะแนน) 2 3 4 n ไม่ อนุญาตให้ ใช้ เมท็อดจากคลาส Math 3. การเวียนเกิดแบบซับซ้ อน (Advanced Recursion) 1. การเวียนเกิดแบบซับซ้ อน ได้ แก่ การเวียนเกิดที่ใช้ เมท็อดตังแต่ 2 เมท็อดขึ ้นไปในการทํางาน (เมท็อดมีการ Overload กัน) ซึงในบทนี ้จะเน้ น ้ ่ การเวียนเกิดแบบ Mutual Recursion เป็ นหลัก © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 9. Recursion - 11 Computer Programming using Java 153 2. ลักษณะของเมท็อดที่ปรากฎในการเวียนเกิดแบบซับซ้ อน โดยทัวไปแล้ วจะเป็ นเมท็อดที่ใช้ ประมวลผล ่ เกี่ยวกับสตริ ง (String) และอาเรย์ (Arrays) ดังตัวอย่างต่อไปนี ้ 1 public static int max(int a[]) { 2 return max(a, 0, a[0]); เมท็อด max(…) มีการ Overload กัน 3 } 4 5 public static int max(int a[], int i, int m) { 6 if (i < a.length) { 7 if (a[i] > m) m = a[i]; เมท็อด max(…) ใช้ หาค่าสมาชิกที่มากที่สดใน ุ 8 return max(a, i + 1, m); 9 } else { อาเรย์ โดยเมท็อด max(…) ด้ านบนจะรับอาเรย์ 10 return m; 11 } เข้ ามาแล้ วส่งต่อไปให้ กบเมท็อด max(…) ด้ าน- ั 12 } ล่างเพื่อเวียนเกิด (Indirect Recursion) 3. หลักการเขียนเมท็อดเวียนเกิดแบบซับซ้ อน การเขียนเมท็อดเวียนเกิดแบบซับซ้ อนจะต้ องเขียนเมท็อดหลายเมท็อดที่ Overload กันเสมอ เพราะเนื่องจาก เมท็อดเวียนเกิดตัวแรกที่ประมวลผลอาจต้ องใช้ ตวแปรหรื อค่าบางค่าเพิ่มเติมภายในเมท็อด และค่าเหล่านัน ั ้ จะต้ องนํากลับไปใช้ ต่อเนื่องในรอบต่อๆ ไปอีกด้ วย เช่น ค่าตําแหน่งปั จจุบนในอาเรย์ เป็ นต้ น ดังนันจึงต้ องส่ง ั ้ ค่าทุกค่าผ่านไปยังพารามิเตอร์ เราจึงจําเป็ นต้ องสร้ างเมท็อดตัวที่สองขึ ้นมาที่ Overload กับตัวแรก เพื่อให้ สามารถส่งค่าทุกค่าที่ต้องใช้ งานผ่านไปยังพารามิเตอร์ ได้ ครบถ้ วน แล้ วให้ ทําการเวียนเกิดที่เมท็อดตัวที่สองนี ้ โจทย์ ข้อที่ 16 [ระดับปานกลาง] จงเขียนเมท็อด search(…) แบบเวียนเกิดเพื่อค้ นหาตําแหน่ งสมาชิกใน อาเรย์ ท่ ีมีค่าเท่ ากับจํานวนเต็มที่รับเข้ ามา ถ้ าค้ นเจอให้ คืนค่ าตําแหน่ งสมาชิกที่เจอ แต่ ถ้าไม่ เช่ นนันให้ ้ คืนค่ า -1 (10 คะแนน) © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 10. 154 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 17 [ระดับปานกลาง] จงเขียนเมท็อด overHundred(…) แบบเวียนเกิดเพื่อนับตัวเลขจํานวน เต็มที่มีค่ามากกว่ า 100 ในอาเรย์ d ที่รับเข้ ามาว่ ามีก่ ีจานวน (10 คะแนน) ํ public class OverHundredNumber { public static void main(String[] args) { int d[] = { 99, 101, 13, 78, 200, 534, 47, 1234, 736 }; System.out.println(overHundred(d)); } } //End of class โจทย์ ข้อที่ 18 [ระดับปานกลาง] จงเขียนเมท็อด revStr(…) แบบเวียนเกิดเพื่อกลับตําแหน่ งของอักขระ ทุกตัวในสตริงจากหลังมาหน้ า เช่ น สตริง "Computer" จะได้ เป็ น "retupmoC" เป็ นต้ น (10 คะแนน) © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 11. Recursion - 11 Computer Programming using Java 155 โจทย์ ข้อที่ 19 [ระดับยาก] จงเขียนเมท็อด formulaAtoB(…)แบบเวียนเกิดเพื่อพิมพ์ สูตรคณตังแม่ a ู ้ จนถึงแม่ b ซึ่งรั บเข้ ามาทางพารามิเตอร์ เช่ น formulaAtoB(6, 15) จะได้ สูตรคณตังแต่ แม่ 6 ถึงแม่ 15 ู ้ เป็ นต้ น (10 คะแนน) โจทย์ ข้อที่ 20 [ระดับยาก] จงเขียนเมท็อด addArray(…) แบบเวียนเกิดเพื่อใช้ สําหรั บหาผลบวกระหว่ าง อาเรย์ หนึ่งมิติ 2 ชุดใดๆ ที่มีจานวนสมาชิกเท่ ากัน แล้ วคืนค่ ากลับ (10 คะแนน) ํ © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้
  • 12. 156 Computer Programming using Java 11 - Recursion โจทย์ ข้อที่ 21 [ระดับยาก] จงเขียนเมท็อด isMatrixEquals(…) แบบเวียนเกิดเพื่อรั บเมตริ กซ์ ชนิด จํานวนเต็มเข้ ามา 2 ตัวเพื่อตรวจสอบว่ าเมตริ กซ์ ทังสองเท่ ากันหรื อไม่ โดยขนาดจะต้ องเท่ ากันทังแถว ้ ้ และหลัก และสมาชิกทุกในตําแหน่ งที่ตรงกันต้ องมีค่าเท่ ากัน (10 คะแนน) © สงวนลิขสิทธิ์ พฤศจิกายน 2553 (ปรับปร ุงครังที่ 7 ฉบับใช้ติวภาค 2/2553) เรียบเรียงโดย วงศ์ยศ เกิดศรี (แบงค์) ้