จากคำถามที่ http://forums.wolfram.com/student-support/topics/26414
กำหนดให้ b มีค่าระหว่าง 0 < b < 1
a1, a2…,a5 แต่ละตัวมีค่า 0 หรือ 1 เท่านั้น
โดยกำหนดให้ a1, a2…,a5 มีความสัมพันธ์คือ
Total[Table[Subscript[a,n]/(2^n),{n,1,5}]]]
คนถามต้องการให้เขียนfunction f ด้วย Mathematica เพื่อหาค่า
a1, a2…,a5 โดยต้องการตามนี้
f[b_]:= ?????
f[1/2] = {1,0,0,0,0} ; best fit of
f[0.344] = {0,1,0,1,1} ; {a1,a2,a3,a4,a5}
ไอ้เราก็เขียนตาม step วิธีคิดที่เข้าใจ
f[b_] := Module[{ai, tryall, pos},
ai = Tuples[{0, 1}, 5];
tryall = #[[1]]/2. + #[[2]]/4. + #[[3]]/8. + #[[4]]/16 + #[[5]]/ 32. & /@ ai;
pos = Nearest[tryall, b];
ai[[#]] & /@ Flatten[Position[tryall, #] & /@ pos]
];
พอมาเจอของอีกคนที่โพสท์ตอบด้วยถึงกับต้องนั่งหัวเราะเลยเพราะมันสั้นมาก
f[b_ /; 0 < b < 1] := IntegerDigits[Round[31*b], 2, 5]
สุดยอดจริงๆ
นี่แหละเสน่ห์ของการเขียนโปรแกรมแก้ปัญหา อย่าไปยึดติด..คิดนอกกรอบบ้าง 🙂