เขียนฟังก์ชั่น comb(n,m) ให้สร้าง combination ของเลข 1 ถึง n จำนวน m ตัว เช่น
>>> print comb(5,3) [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]]
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
โค้ดไม่สวยนะครับ แบบว่าทำไปแก้ไป
> def comb(n,m) stack = Array.new(m) count = 0 (1..n).each do |a| (a..n).each do |i| stack.clear stack.push(a) count = 1 ((i+1)..(n+1)).each do |j| if count == m then count -= 1 puts stack.to_s stack.pop end stack.push(j) count+=1 end end end end comb(5,3) </blockcode>กำลังอยากได้ไอเดียแบบ non-recursive พอดี
แต่ดูแล้วเหมือนทำ recursive ด้วยตัวเองนะเนี่ยะ (แบบใช้ stack เก็บ state)
ตอนแรกผมก็จะคิดแบบ recursive นั่นแหละครับแต่ว่าคิดไม่ออกว่าจะเขียน method ยังไง
แต่ว่าไล่ stack ได้นะครับ ก็เลยใช้ stack เลย
อย่างน้อยก็ไม่จำกัดที่ stack ของภาษา ว่าแต่มีแบบ random access มั๊ยครับ
ของผมขอส่งช้าหน่อยนะครับ
ช่วงนี้นอนน้อย สมองส่วน programming ไม่ทำงานแล้ว
อันแรกที่ผมทำผมว่ายังผิดอยู่ก็เลยกลับไปแก้และลองพยายามไม่ใช้stack ก็ได้ตามนี้ครับ
in haskell
Note:
สำหรับคนไม่คุ้นกับ List comprehension
อ่านดูได้ที่นี่ List Comprehension
อยากคิดเป็นฟังก์ชันแบบนี้ได้บ้างนะครับ แต่คิดไงก็คิดไม่ออก
ใช่คิดยาก
ขนาดผมฝึกมาเรื่อยๆแล้ว ก็ยังรู้สึกยากอยู่
สำหรับผม ที่ช่วยได้เยอะ ก็คือต้องอาศัยดู code คนอื่นบ่อยๆ
ผมชอบ
(dropWhile (<= x) xs)จังin ruby
สร้าง helper ใน class Integer
ทำให้เราใช้คำสั่งแบบนี้ได้
จากนั้นก็เขียน comb function
Note: จะเห็นได้ว่า ก็ลอกแนวมาจาก haskell version นั่นแหล่ะ