Categories
BYOB Programming

ฟังก์ชันที่เรียกต้วมันเอง

ฟังก์ชันที่เรียกต้วมันเอง เป็นฟังก์ชันชนิดหนึ่งเรียกว่า Recursive function ทำไมถึงต้องมีฟังก์ชันชนิดนี้ แล้วมันมีประโยชน์อย่างไร มาหาคำตอบกัน

แนวคิดของฟังก์ชันที่เรียกตัวมันเอง มีให้เห็นในปรากฏการณ์ทางธรรมชาติเหมือนกัน เช่น รูปร่างของเกล็ดหิมะ ต้นไม้ ใบเฟิร์น หรือ เปลือกหอย เป็นต้น รูปร่างของพวกมันจะมีหน้าตาเหมือนกัน แต่จะมีขนาดไม่เท่ากัน รูปแบบเหล่านี้เรียกว่า แฟร็กทัล (Fractal)

ในการคำนวณบางอย่าง เช่น การหาค่า factorial 5! = 5 x 4 x 3 x 2 x1 = 120 สามารถเขียนได้อีกรูปแบบหนึ่งคือ 5! = 5 x 4! ซึ่ง 4! = 4 x 3! , 3! = 3 x 2!, 2! = 2 x 1! เราจะเห็นรูปแบบการเรียกตัวมันเองเกิดขึ้นไปเรื่อย ๆ ด้วยตัวเลขที่ลดลงจนกระทั่ง 1! = 1 ซึ่งเป็นรูปแบบที่ไม่สามารถเรียกตัวมันเองได้อีกแล้ว

จากตัวอย่างข้างต้น จะเห็นได้ว่าการสร้างฟังก์ชันเรียกตัวมันเอง ต้องมีเงื่อนไขอยู่ 2 อย่างคือ

  1. ต้องมีรูปแบบพื้นฐานที่ไม่สามารถเรียกตัวมันเองได้ ซึ่งเป็นวิธีหยุดการทำงานของฟังก์ชันเรียกตัวมันเอง มิฉนั้น ฟังก์ชันจะทำงานไปเรื่อย ๆ ไม่มีวันจบ
  2. การเรียกตัวมันเองต้องมีแนวโน้มที่จะไปสู่รูปแบบพื้นฐาน ซึ่งอาจมีมากกว่า 1 แบบก็ได้

การเขียนโปรแกรมด้วยฟังก์ชันแบบนี้ จะทำให้ได้โปรแกรมที่สั้นและเข้าใจได้ง่าย (รึเปล่า) ซึ่งใน BYOB สามารถทำได้เช่นกัน มาลองดูกันคราวหน้านะครับ

Categories
Education

คณิตศาสตร์ในเด็กประถม

ช่วงหนึ่งเดือนกว่าๆ มานี้ ผมมีโอกาสไปสอนพิเศษ วิชาคณิตศาสตร์ให้กับเด็กประถมปลายในโรงเรียนแห่งหนึ่ง เด็กที่มาเรียนก็ได้รับการสอบคัดเลือกมาเรียน ระดับชั้นหนึ่งก็มีสักสิบกว่าคน เด็กที่นี่ก็เรียกได้ว่าเก่งทีเดียว เนื้อหาที่เรียนก็ไปไกลมากเมื่อเทียบกับสมัยที่ผมยังเด็กๆ อยู่ บางเรื่องผมเรียนตอนมัธยมต้น บางเรื่องผมเรียนตอนมัธยมปลาย แต่เด็กประถมสมัยนี้เรียนกันแล้ว !

หลังจากสอนมาระยะหนึ่ง ก็พอรู้มาบ้างว่าเด็กสมัยนี้เรียนไวจริงๆ แต่ไม่แน่ใจว่าเป็นเด็กเฉพาะกลุ่มหรือเปล่า เด็กในห้องส่วนใหญ่ติวพิเศษหลังเลิกเรียนหรือเสาร์อาทิตย์ บางคนเรียนพิเศษไปถึง ม.4 แล้ว

แต่เป็นที่น่าสังเกตุอยู่อย่างหนึ่ง คือ เด็กส่วนใหญ่สามารถทำโจทย์กันได้ แต่เวลาให้แสดงวิธีทำ หรือ วิธีคิด เด็กมักไม่แน่ใจ บางคนก็รู้ว่าโจทย์แบบนี้ต้องใช้สูตรอะไรแต่อธิบายไม่ได้  บางคนก็ใช้วิธีลัด ซึ่งเป็นการมองข้ามกระบวนการคิดอย่างเป็นขั้นเป็นตอนไป

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

บางสิ่งที่ง่ายๆ ในความคิดเรา ทำให้เราลืมรายละเอียดของสิ่งที่เราเข้าใจได้ดีแล้ว เช่น การวาดรูปสี่เหลี่ยมมุมฉาก สำหรับคอมพิวเตอร์ที่ทำงานได้เร็ว แม่นยำ ไม่มีเหนื่อย แต่จะทำงานให้ถูกต้องอย่างที่ต้องการ ต้องบอกวิธีการอย่างเป็นขั้นตอนให้มันก่อน ซึ่งเป็นกระบวนการหนึ่งในการเขียนโปรแกรม

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

ผมไม่แน่ใจนะว่าระบบติวเพื่อทำแต่ข้อสอบ มีผลต่อกระบวนการคิดของเด็กมากน้อยขนาดไหน ผมก็พยายามให้พวกเขาฝึกคิด คิดช้าๆอย่างเป็นขั้นตอน และที่สำคัญ ต้องสื่อสารออกมาให้ได้ว่าคิดอย่างไร คำตอบสุดท้ายอาจไม่สำคัญเท่ากับกระบวนการได้มาซึ่งคำตอบนั้น