ลำดับสเติร์น-Brocotเป็น Fibonnaci เหมือนลำดับซึ่งสามารถสร้างดังนี้
- เริ่มต้นลำดับด้วย
s(1) = s(2) = 1
- ตั้งเคาน์เตอร์
n = 1
- ผนวก
s(n) + s(n+1)
เข้ากับลำดับ - ผนวก
s(n+1)
เข้ากับลำดับ - เพิ่มขึ้น
n
กลับไปยังขั้นตอนที่ 3
นี่เทียบเท่ากับ:
ในบรรดาคุณสมบัติอื่น ๆ ลำดับ Stern-Brocot สามารถใช้เพื่อสร้างจำนวนตรรกยะเชิงบวกที่เป็นไปได้ทั้งหมด จำนวนตรรกยะทุกตัวจะถูกสร้างขึ้นหนึ่งครั้งและจะปรากฏในเงื่อนไขที่ง่ายที่สุดเสมอ ตัวอย่างเช่น1/3
เป็นจำนวนตรรกยะที่ 4 ในลำดับ แต่ตัวเลขที่เทียบเท่า2/6
และ3/9
อื่น ๆ จะไม่ปรากฏเลย
เราสามารถกำหนดจำนวนตรรกยะที่ n เป็นr(n) = s(n) / s(n+1)
โดยที่s(n)
หมายเลขสเติร์น - โบรคต์ดังที่อธิบายไว้ข้างต้น
ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่จะส่งออกจำนวนเหตุผลที่ n ที่สร้างขึ้นโดยใช้ลำดับ Stern-Brocot
- อัลกอริทึมที่อธิบายไว้ข้างต้นได้รับการจัดทำดัชนี 1 ชุด ถ้ารายการของคุณถูกจัดทำดัชนี 0 โปรดระบุคำตอบของคุณ
- อัลกอริธึมที่อธิบายไว้มีวัตถุประสงค์เพื่อเป็นตัวอย่างเท่านั้นเอาต์พุตสามารถได้มาในแบบที่คุณชอบ (นอกเหนือจากการเข้ารหัสแบบฮาร์ด)
- อินพุตสามารถผ่าน STDIN พารามิเตอร์ฟังก์ชันหรือกลไกอินพุตที่เหมาะสมอื่น ๆ
- Ouptut สามารถไปที่ STDOUT คอนโซลค่าส่งคืนฟังก์ชันหรือสตรีมเอาต์พุตอื่น ๆ ที่สมเหตุสมผล
- ผลลัพธ์จะต้องเป็นสตริงในรูปแบบ
a/b
ที่ไหนa
และb
เป็นรายการที่เกี่ยวข้องในลำดับ Stern-Brocot การประเมินเศษส่วนก่อนส่งออกจะไม่ได้รับอนุญาต ตัวอย่างเช่นสำหรับการป้อนข้อมูล12
การส่งออกควรจะเป็นไม่ได้2/5
0.4
- ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ
กรณีทดสอบ
กรณีทดสอบที่นี่มีการจัดทำดัชนี 1
n r(n)
-- ------
1 1/1
2 1/2
3 2/1
4 1/3
5 3/2
6 2/3
7 3/1
8 1/4
9 4/3
10 3/5
11 5/2
12 2/5
13 5/3
14 3/4
15 4/1
16 1/5
17 5/4
18 4/7
19 7/3
20 3/8
50 7/12
100 7/19
1000 11/39
รายการ OEIS: A002487
วิดีโอจำนวนนับที่ยอดเยี่ยมพูดคุยถึงลำดับ: เศษส่วนไม่สิ้นสุด
True/2
ไม่ใช่เศษส่วนที่ถูกต้อง (เท่าที่ฉันกังวล) เช่นกันTrue
ไม่ได้เสมอ1
- บางภาษาใช้-1
แทนเพื่อหลีกเลี่ยงความผิดพลาดที่อาจเกิดขึ้นเมื่อมีการใช้ผู้ประกอบการระดับบิต [จำเป็น]
True
เทียบเท่ากับ1
และจะเป็นTrue/2
1/2
True
s แทน1
s ได้หรือไม่?