スターン- Brocot配列は Fibonnaci様配列次のように構成することが可能です。
- シーケンスを初期化する
s(1) = s(2) = 1
- カウンターを設定
n = 1
s(n) + s(n+1)
シーケンスに追加するs(n+1)
シーケンスに追加する- インクリメント
n
、ステップ3に戻る
これは次と同等です:
他のプロパティの中でも、Stern-Brocotシーケンスを使用して、可能なすべての正の有理数を生成できます。すべての有理数は一度だけ生成され、常に最も単純な用語で表示されます。たとえば、1/3
シーケンスの第四有理数、同等の数字である2/6
、3/9
などがまったく表示されません。
上記のように、n番目の有理数をとして定義できますr(n) = s(n) / s(n+1)
。ここでs(n)
は、n番目のStern-Brocot数です。
あなたの課題は、Stern-Brocotシーケンスを使用して生成されたn番目の有理数を出力するプログラムまたは関数を作成することです。
- 上記のアルゴリズムは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
シーケンスについて説明している優秀なNumberphileビデオ:Infinite Fractions
True/2
有効な分数ではありません(私に関する限り)。余談ですTrue
が、常にそうとは限りません。1
一部の言語では、-1
ビット演算子を適用する際の潜在的な間違いを避けるために代わりに使用します。[要出典]
True
と同等で1
、にTrue/2
なります1/2
。
True
sの代わりに1
sを使用できますか?