所述的Stern-Brocot序列是一个Fibonnaci样序列,其可被构造为如下:
- 用初始化序列
s(1) = s(2) = 1
- 设置柜台
n = 1
- 追加
s(n) + s(n+1)
到序列 - 追加
s(n+1)
到序列 - 递增
n
,返回到步骤3
这等效于:
除其他特性外,斯特恩-布罗克序列可用于生成每个可能的正有理数。每个有理数将只生成一次,并且始终以最简单的形式出现。例如,1/3
是序列中的第4个有理数,但当量数2/6
,3/9
等等都不会出现。
如上所述,我们可以将第n个有理数定义为r(n) = s(n) / s(n+1)
,其中s(n)
第n个Stern-Brocot数是。
您面临的挑战是编写一个程序或函数,该程序或函数将输出使用Stern-Brocot序列生成的第n个有理数。
- 上面描述的算法是1索引的;如果您输入的内容是0索引,请在答案中说明
- 所描述的算法仅用于说明目的,可以按照您喜欢的任何方式(硬编码除外)导出输出
- 可以通过STDIN,功能参数或任何其他合理的输入机制进行输入
- 输出可以是STDOUT,控制台,函数返回值或任何其他合理的输出流
- 输出必须是形式为的字符串
a/b
,其中a
和b
是Stern-Brocot序列中的相关条目。不允许在输出之前评估分数。例如,对于input12
,输出应该为2/5
,而不是0.4
。 - 不允许出现标准漏洞
这是代码高尔夫球,因此最短答案(以字节为单位)将获胜。
测试用例
这里的测试用例是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
True/2
不是有效分数(就我而言)。顺便说一句,True
并非总是如此1
-有些语言-1
在应用按位运算符时会使用它来避免潜在的错误。[需要引用]
True
中等效于1
并且True/2
将是1/2
。
True
s代替1
s吗?