La sequenza Stern-Brocot è una sequenza simile a Fibonnaci che può essere costruita come segue:
- Inizializza la sequenza con
s(1) = s(2) = 1
- Imposta contatore
n = 1
- Aggiungi
s(n) + s(n+1)
alla sequenza - Aggiungi
s(n+1)
alla sequenza - Incremento
n
, tornare al passaggio 3
Ciò equivale a:
Tra le altre proprietà, la sequenza Stern-Brocot può essere utilizzata per generare ogni possibile numero razionale positivo. Ogni numero razionale verrà generato esattamente una volta e apparirà sempre nei suoi termini più semplici; per esempio, 1/3
è il 4 ° numero razionale nella sequenza, ma i numeri equivalenti 2/6
, 3/9
ecc. non appariranno affatto.
Possiamo definire l'ennesimo numero razionale come r(n) = s(n) / s(n+1)
, dove si s(n)
trova l'ennesimo numero Stern-Brocot, come descritto sopra.
La tua sfida è scrivere un programma o una funzione che genererà l'ennesimo numero razionale generato usando la sequenza Stern-Brocot.
- Gli algoritmi sopra descritti sono 1 indicizzati; se la voce è indicizzata 0, indicare nella risposta
- Gli algoritmi descritti sono solo a scopo illustrativo, l'output può essere derivato nel modo che preferisci (oltre alla codifica hardware)
- L'input può essere tramite STDIN, parametri di funzione o qualsiasi altro meccanismo di input ragionevole
- Ouptut può essere su STDOUT, console, valore di ritorno della funzione o qualsiasi altro flusso di output ragionevole
- L'output deve essere una stringa nel modulo
a/b
, dovea
eb
sono le voci pertinenti nella sequenza Stern-Brocot. La valutazione della frazione prima dell'output non è consentita. Ad esempio, per l'input12
, l'output dovrebbe essere2/5
, non0.4
. - Le scappatoie standard non sono ammesse
Questo è code-golf , quindi vincerà la risposta più breve in byte.
Casi test
I casi di test qui sono 1 indicizzati.
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
Voce
OEIS: A002487
Eccellente video di Numberphile che discute la sequenza: Frazioni Infinite
True/2
non è una frazione valida (per quanto mi riguarda). A parte questo, True
non è sempre 1
- alcune lingue usano -1
invece per evitare potenziali errori quando si applicano operatori bit per bit. [citazione necessaria]
True
è equivalente 1
e True/2
sarebbe 1/2
.
True
s invece di1
s?