[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-js2go-ep37-recursion-vs-iteration-in-javascript-and-go-all--*":3,"academy-blog-translations-37rbeb1gdzv1ezc":84},{"data":4,"page":83,"perPage":83,"totalItems":83,"totalPages":83},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":77,"keywords":78,"locale":54,"published_at":79,"scheduled_at":13,"school_blog":75,"short_description":80,"slug":81,"status":73,"title":6,"updated":82,"updated_by":13,"views":76},"JS2GO EP.37 การใช้ Recursion และ Iteration ใน JavaScript และ Go","sclblg987654321","school_blog_translations","\u003Cp>ทุกโปรแกรมเมอร์ต้องเคยเจอกับงานที่ต้องทำซ้ำ เช่น\u003C\u002Fp>\u003Cul>\u003Cli>การหาผลรวมของตัวเลข\u003C\u002Fli>\u003Cli>การคำนวณค่า Factorial\u003C\u002Fli>\u003Cli>หรือการสร้างลำดับ Fibonacci\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>โดยทั่วไปแล้วจะมีอยู่ 2 วิธีในการทำงานซ้ำ:\u003C\u002Fp>\u003Cul>\u003Cli>Recursion (การเรียกซ้ำ) — ฟังก์ชันเรียกตัวเองซ้ำ ๆ\u003C\u002Fli>\u003Cli>Iteration (การวนซ้ำ) — ใช้ลูป เช่น \u003Ccode inline=\"\">for\u003C\u002Fcode> หรือ \u003Ccode inline=\"\">while\u003C\u002Fcode> เพื่อทำงานซ้ำ\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>แม้ทั้งสองวิธีให้ผลลัพธ์เหมือนกัน แต่ต่างกันในด้าน ประสิทธิภาพ (performance), การใช้หน่วยความจำ (memory usage) และ ความเข้าใจง่ายของโค้ด (readability)\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>มาดูกันว่า JavaScript และ Go จัดการแนวทางทั้งสองแบบนี้แตกต่างกันอย่างไร 👇\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>1. Recursion — การเรียกซ้ำ (Function Calling Itself)\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 JavaScript: Recursion\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">function factorial(n) {\n  if (n === 0) return 1;\n  return n * factorial(n - 1);\n}\n\nconsole.log(factorial(5)); \u002F\u002F Output: 120\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>อธิบาย:\u003Cbr>\u003Ccode inline=\"\">factorial(5)\u003C\u002Fcode> จะเรียกตัวเองซ้ำเรื่อย ๆ จนถึง \u003Ccode inline=\"\">factorial(0)\u003C\u002Fcode>\u003Cbr>จากนั้นค่าจะถูกส่งกลับและคูณย้อนขึ้นมาทีละชั้น\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อดี:\u003Cbr>✅ โค้ดอ่านง่าย และเข้าใจแนวคิดทางคณิตศาสตร์ได้ตรงไปตรงมา\u003Cbr>✅ เหมาะกับปัญหาที่มีลักษณะ “ซ้ำซ้อนแบบลดลง” เช่น การไล่โครงสร้างต้นไม้ (Tree Traversal)\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อเสีย:\u003Cbr>❌ ใช้หน่วยความจำใน Stack มาก → เสี่ยงเกิด “Stack Overflow” หาก recursion ลึกเกินไป\u003Cbr>❌ ช้ากว่า iteration ในงานที่ต้องเรียกซ้ำจำนวนมาก\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 Go: Recursion\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport \"fmt\"\n\nfunc factorial(n int) int {\n\tif n == 0 {\n\t\treturn 1\n\t}\n\treturn n * factorial(n-1)\n}\n\nfunc main() {\n\tfmt.Println(factorial(5)) \u002F\u002F Output: 120\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>อธิบาย:\u003Cbr>ทำงานแบบเดียวกับ JavaScript แต่ Go จัดการ Stack ได้มีประสิทธิภาพมากกว่าเล็กน้อย\u003Cbr>เพราะ Go compiler บางเวอร์ชันมีการ “optimize” การเรียกซ้ำในบางกรณี (Tail Recursion Optimization)\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>สรุป:\u003Cbr>Recursion ใน Go เหมาะกับงานที่ต้องแยกย่อยซ้ำ ๆ เช่น\u003C\u002Fp>\u003Cul>\u003Cli>Tree Traversal\u003C\u002Fli>\u003Cli>Depth-First Search (DFS)\u003C\u002Fli>\u003Cli>Recursive Parsing\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>2. Iteration — การวนซ้ำ (Using Loops)\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 JavaScript: Iteration\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">function factorialIterative(n) {\n  let result = 1;\n  for (let i = 1; i &lt;= n; i++) {\n    result *= i;\n  }\n  return result;\n}\n\nconsole.log(factorialIterative(5)); \u002F\u002F Output: 120\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อดี:\u003Cbr>✅ ใช้หน่วยความจำ (stack) น้อยกว่า recursion\u003Cbr>✅ เร็วกว่าในกรณีที่ต้องทำงานซ้ำจำนวนมาก\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อเสีย:\u003Cbr>❌ โค้ดอาจยาวและซับซ้อนกว่า recursion เล็กน้อย\u003Cbr>❌ ไม่เหมาะกับปัญหาที่มีโครงสร้าง recursive โดยธรรมชาติ เช่น Tree หรือ Graph\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 Go: Iteration\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport \"fmt\"\n\nfunc factorialIterative(n int) int {\n\tresult := 1\n\tfor i := 1; i &lt;= n; i++ {\n\t\tresult *= i\n\t}\n\treturn result\n}\n\nfunc main() {\n\tfmt.Println(factorialIterative(5)) \u002F\u002F Output: 120\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อดี:\u003Cbr>✅ ประสิทธิภาพสูง เหมาะกับระบบ Production\u003Cbr>✅ ใช้หน่วยความจำน้อย\u003Cbr>✅ Go compiler สามารถ optimize loop ได้อย่างมีประสิทธิภาพ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>3. การเปรียบเทียบ Recursion และ Iteration\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>คุณสมบัติ\u003C\u002Fth>\u003Cth>Recursion\u003C\u002Fth>\u003Cth>Iteration\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>แนวคิด\u003C\u002Ftd>\u003Ctd>ฟังก์ชันเรียกตัวเอง\u003C\u002Ftd>\u003Ctd>ใช้ลูปทำงานซ้ำ\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Readability\u003C\u002Ftd>\u003Ctd>อ่านง่ายในปัญหาที่ซับซ้อน\u003C\u002Ftd>\u003Ctd>เข้าใจง่ายในงานทั่วไป\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Performance\u003C\u002Ftd>\u003Ctd>ช้ากว่าเล็กน้อย\u003C\u002Ftd>\u003Ctd>เร็วกว่ามาก\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Memory Usage\u003C\u002Ftd>\u003Ctd>ใช้ Stack มาก\u003C\u002Ftd>\u003Ctd>ใช้หน่วยความจำน้อย\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>เหมาะกับ\u003C\u002Ftd>\u003Ctd>Tree, Graph, Divide &amp; Conquer\u003C\u002Ftd>\u003Ctd>Loop, Counting, Accumulation\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>4. ตัวอย่างการใช้งานจริง — Tree Traversal (DFS)\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 JavaScript: Recursive Tree Traversal\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">const tree = {\n  value: 1,\n  children: [{ value: 2 }, { value: 3, children: [{ value: 4 }] }]\n};\n\nfunction traverse(node) {\n  console.log(node.value);\n  if (node.children) {\n    node.children.forEach(traverse);\n  }\n}\n\ntraverse(tree);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 Go: Recursive Tree Traversal\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport \"fmt\"\n\ntype Node struct {\n\tValue    int\n\tChildren []*Node\n}\n\nfunc traverse(n *Node) {\n\tfmt.Println(n.Value)\n\tfor _, child := range n.Children {\n\t\ttraverse(child)\n\t}\n}\n\nfunc main() {\n\ttree := &amp;Node{\n\t\tValue: 1,\n\t\tChildren: []*Node{\n\t\t\t{Value: 2},\n\t\t\t{Value: 3, Children: []*Node{{Value: 4}}},\n\t\t},\n\t}\n\ttraverse(tree)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์ที่ได้:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">1\n2\n3\n4\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>5. แนวทางการเลือกใช้\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>🧠 ใช้ Recursion เหมาะกับปัญหาที่มีโครงสร้างซ้ำซ้อน เช่น\u003C\u002Fp>\u003Cul>\u003Cli>Tree \u002F Graph Traversal\u003C\u002Fli>\u003Cli>Divide &amp; Conquer (เช่น Merge Sort, Quick Sort)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>⚙️ ใช้ Iteration เหมาะกับงานทั่วไป เช่น\u003C\u002Fp>\u003Cul>\u003Cli>Loop, Counting, Summation\u003Cbr>โดยเฉพาะในระบบ Production ที่ต้องการความเร็วและความเสถียร\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>💡 ใน Go: การวนซ้ำ (Iteration) ถูก optimize ดีกว่าการเรียกซ้ำ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>💻 ใน JavaScript: Recursion เหมาะกับการสอนแนวคิดและการจำลอง algorithm แต่ในระบบจริง Iteration มักเสถียรกว่า\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ทั้ง Recursion และ Iteration เป็นเครื่องมือสำคัญสำหรับนักพัฒนา การเลือกใช้ให้เหมาะสมจะช่วยให้โค้ดของคุณ อ่านง่ายขึ้น, ใช้ทรัพยากรน้อยลง, และ ทำงานได้เร็วขึ้น\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>สถานการณ์\u003C\u002Fth>\u003Cth>วิธีที่เหมาะสม\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>ปัญหา Tree \u002F Graph\u003C\u002Ftd>\u003Ctd>🧠 Recursion\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>งานทั่วไป \u002F การวนซ้ำ\u003C\u002Ftd>\u003Ctd>⚙️ Iteration\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>เน้น Performance\u003C\u002Ftd>\u003Ctd>⚡ Iteration (โดยเฉพาะใน Go)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>เน้นความเข้าใจง่าย\u003C\u002Ftd>\u003Ctd>💡 Recursion\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตอนต่อไป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน EP.38 ของซีรีส์ JS2GO\u003Cbr>เราจะพาคุณไปเรียนรู้ การจัดการ Buffer และ Stream ใน Node.js และ Go เพื่อเข้าใจการทำงานกับข้อมูลขนาดใหญ่ เช่น การอ่านไฟล์, การส่งข้อมูลผ่านเครือข่าย (Network), และการจัดการ Memory อย่างมีประสิทธิภาพในระบบ Production ⚙️\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevschool\u002F\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>","73_11zon_e3x83hj33c.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fnp98njk711u28jh\u002F73_11zon_e3x83hj33c.webp","2026-03-04 08:45:32.896Z","",{"keywords":15,"locale":48,"school_blog":58},[16,23,28,33,38,43],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:45:30.765Z","nayuhpre9emd5xw","JS2GO","2026-04-10 16:12:59.160Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:20:42.484Z","vslzz9nvv6n77cx","JavaScript","2026-04-10 16:07:28.339Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:45:31.134Z","erv835t5leo90qz","Iteration","2026-04-10 16:12:59.301Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:45:31.539Z","thoynmyxpcmdicf","Recursion","2026-04-10 16:12:59.439Z",{"code":49,"collectionId":50,"collectionName":51,"created":52,"flag":53,"id":54,"is_default":55,"label":56,"updated":57},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":59,"collectionId":60,"collectionName":61,"expand":62,"id":75,"views":76},"hsa1afr8fcnd6qb","pbc_2105096300","school_blogs",{"category":63},{"blogIds":64,"collectionId":65,"collectionName":66,"created":67,"created_by":13,"id":59,"image":68,"image_alt":13,"image_path":69,"label":70,"name":21,"priority":71,"publish_at":72,"scheduled_at":13,"status":73,"updated":74,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:24:37.986Z","js2_go_2_11zon_y6paxmuz32.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fhsa1afr8fcnd6qb\u002Fjs2_go_2_11zon_y6paxmuz32.webp",{"en":21,"th":21},10,"2025-08-11 03:41:08.820Z","published","2026-04-25 02:32:14.339Z","37rbeb1gdzv1ezc",228,"np98njk711u28jh",[20,25,30,35,40,45],"2025-11-12 02:36:45.781Z","เรียนรู้ความแตกต่างระหว่างการเขียนโค้ดแบบ Recursion (การเรียกซ้ำ) และ Iteration (การวนซ้ำ) พร้อมตัวอย่างโค้ดจริงใน JavaScript และ Go เพื่อเปรียบเทียบความเร็ว การใช้หน่วยความจำ และแนวทางเลือกใช้ในระบบจริง","js2go-ep37-recursion-vs-iteration-in-javascript-and-go","2026-04-25 02:47:54.241Z",1,{"th":81}]