_Ḟ1+¡
Esta é uma solução iterativa sem built-ins. Ele usa a mesma indexação que a especificação do desafio.
Experimente online!
fundo
Seja f a função definida na especificação de desafio e F a função Fibonacci definida como de costume (ou seja, com F (0) = 0 ). Para um número inteiro não negativo n , temos f (n) = F (n + 1) . Quando 0 ≤ x <1 , a especificação de desafio define f (n + x) como f (n) + (f (n + 1) - f (n)) x .
Claramente, esta apenas atinge os casos de base, mas não a fórmula recursiva, isto é, f (n) = f (n - 1) + f (n - 2) mantém como o faria para F . Isso significa que podemos simplificar a definição de argumentos não inteiros para facilitar f (n) = f (n) + f (n - 1) x .
Como outros observaram em suas respostas, o relacionamento recursivo também vale para argumentos não inteiros. Isso é facilmente verificável, pois
Desde F (0) = F (1) = 1 , f em constante no intervalo [0, 1] e f (0 + x) = 1 para todos os x . Além disso, f (-1) = F (0) = 0 , então f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Esses casos básicos cobrem em [-1, 1) ; portanto, juntamente com a fórmula recursiva, eles completam a definição de f .
Como funciona
Como antes, seja n + x o único argumento de nosso programa monádico.
¡
é uma rápida , o que significa que ele consome alguns links para a sua esquerda e os transforma em um link rápido . ¡
em particular, consome um ou dois links.
<F:monad|dyad><N:any>
chama o link N , retornando r , e executa F um total de r vezes.
<nilad|missing><F:monad|dyad>
define r para o último argumento da linha de comando (ou uma entrada de STDIN na ausência deles) e executa F um total de r vezes.
Como 1
é um nilad (um link sem argumentos), o segundo caso se aplica e +¡
será executado +
n vezes (um argumento não inteiro é arredondado para baixo). Após cada chamada para +
, o argumento esquerdo do link rápido é substituído pelo valor retornado, e o argumento direito pelo valor anterior do argumento esquerdo.
Quanto ao programa inteiro, Ḟ
pisa a entrada, produzindo n ; então _
subtrair o resultado a partir da entrada, dando origem a ** x, o que torna o valor de retorno.
1+¡
então chama +¡
- como descrito anteriormente - com o argumento esquerdo 1 = f (0 + x) e o argumento direito x = f (-1 + x) , que calcula a saída desejada.