กุญแจสำคัญของคำตอบอยู่ที่การหารครับ อย่างที่เคยเรียนกันมาตอนเด็กๆ ว่าเราไม่สามารถหารด้วย 0 ได้ อาจารย์บางท่านอาจจะสอนว่าเมื่อหารด้วย 0 จะได้ ∞ (อินฟินิตี้) แต่ทางเทคนิคแล้วที่ถูกต้องคือ ไม่นิยามครับ (อินฟินิตี้นั้นไม่ใช่ตัวเลข จะนำมาบวกลบคูณหารแบบตัวเลขทั่วไปไม่ได้ เช่น ∞-∞ อาจเป็น 0 หรือ 10 หรือ ∞ ก็ได้) ในคอมพิวเตอร์ก็เช่นกันครับ ถ้าเจอการหารด้วย 0 คอมพิวเตอร์ก็คำนวณไม่ถูกเหมือนกัน ทำได้แค่คืน error กลับมา คำตอบจึงได้ (ในภาษา C)
int f(int x) { return x * ( (x-6) / (x-6) ); }
นั่นคือสำหรับ x≠6 จะคืนค่า x(x-6)/(x-6)=x แต่สำหรับ x=6 จะคืน error divide by zero กลับมา
ปัญหานี้พบขณะคิดงานวิจัย โดยต้องการที่จะออกแบบวิธีการเข้ารหัส ซึ่งทำการเข้ารหัส (คำนวณฟังก์ชันบางอย่าง) สำหรับทุกๆ ค่า ยกเว้นอยู่ค่าเดียวที่จะเป็นฟังก์ชันอื่น แต่ข้อจำกัดคือไม่สามารถใช้อย่างอื่นได้นอกจากการบวกลบคูณหาร ตอนแรกๆ ก็คิดว่าเป็นไปไม่ได้ (ถ้าไม่มีหารทำไม่ได้แน่ครับ ให้ไปคิดเป็นการบ้านว่าทำไม?) แต่ในที่สุดก็คิดนอกกรอบ จนได้วิธีเข้ารหัสแบบนี้ขึ้นมา แต่สุดท้ายก็ไปติดปัญหาที่จุดอื่น เลยยังเป็นแค่ปัญหาชวนคิด ให้ทุกท่านได้ฝึกคิดนอกกรอบกันบ้าง
ชิ
ReplyDeleteงอน
(งอนตัวเอง)
แค่นี้เอง
เฮ่อออออ ถ้าเราคิดนอกกรอบได้ เราก็จะเริ่มฉลาดใกล้ๆคุณพ่อครัวใช่ไหมคะ?
เอาอีก แต่ขอเป็นเดือนห้าได้มิคะ มีงานต้องส่งเมษา ฮ่ะฮ่ะ