A sequência Stern-Brocot é uma sequência do tipo Fibonnaci que pode ser construída da seguinte maneira:
- Inicialize a sequência com
s(1) = s(2) = 1
- Definir contador
n = 1
- Anexar
s(n) + s(n+1)
à sequência - Anexar
s(n+1)
à sequência - Incremento
n
, volte para a etapa 3
Isso é equivalente a:
Entre outras propriedades, a sequência Stern-Brocot pode ser usada para gerar todo número racional positivo possível. Todo número racional será gerado exatamente uma vez e sempre aparecerá nos seus termos mais simples; por exemplo, 1/3
é o número 4 racional na sequência, mas os números equivalentes 2/6
, 3/9
etc não aparece de todo.
Podemos definir o enésimo número racional como r(n) = s(n) / s(n+1)
, onde s(n)
é o enésimo número Stern-Brocot, conforme descrito acima.
Seu desafio é escrever um programa ou função que produza o enésimo número racional gerado usando a sequência Stern-Brocot.
- Os algoritmos descritos acima são indexados em 1; se sua entrada for 0 indexada, indique na sua resposta
- Os algoritmos descritos são apenas para fins ilustrativos, a saída pode ser derivada da maneira que você desejar (exceto a codificação)
- A entrada pode ser via STDIN, parâmetros de função ou qualquer outro mecanismo de entrada razoável
- Ouptut pode ser STDOUT, console, valor de retorno da função ou qualquer outro fluxo de saída razoável
- A saída deve ser como uma sequência no formulário
a/b
, ondea
eb
são as entradas relevantes na sequência Stern-Brocot. Avaliar a fração antes da saída não é permitido. Por exemplo, para entrada12
, a saída deve ser2/5
, não0.4
. - As brechas padrão não são permitidas
Isso é código-golfe , então a resposta mais curta em bytes vencerá.
Casos de teste
Os casos de teste aqui são indexados 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
Entrada OEIS: A002487
Excelente vídeo Numberphile discutindo a sequência: Frações infinitas
True/2
não é uma fração válida (no que me diz respeito). Como um aparte, True
nem sempre é 1
- alguns idiomas usam -1
para evitar possíveis erros ao aplicar operadores bit a bit. [citação necessário]
True
é equivalente 1
e True/2
seria 1/2
.
True
s em vez de1
s?