_Ḟ1+¡
Esta es una solución iterativa sin elementos integrados. Utiliza la misma indexación que la especificación de desafío.
Pruébalo en línea!
Antecedentes
Sea f la función definida en la especificación de desafío y F la función de Fibonacci definida como de costumbre (es decir, con F (0) = 0 ). Para un número entero no negativo n , tenemos f (n) = F (n + 1) . Cuando 0 ≤ x <1 , la especificación de desafío define f (n + x) como f (n) + (f (n + 1) - f (n)) x .
Claramente, esto sólo afecta a los casos base, pero no la fórmula recursiva, es decir, f (n) = f (n - 1) + f (n - 2) ejerce como lo haría para F . Esto significa que podemos simplificar la definición de argumentos no enteros a f (n) = f (n) + f (n - 1) x más fácil .
Como otros han señalado en sus respuestas, la relación recursiva también es válida para argumentos no enteros. Esto es fácilmente verificable, ya que
Desde f (0) = f (1) = 1 , f en constante en el intervalo [0, 1] y f (0 + x) = 1 para todos x . Además, f (-1) = F (0) = 0 , entonces f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Estos casos básicos cubren en [-1, 1) , por lo que junto con la fórmula recursiva, completan la definición de f .
Cómo funciona
Como antes, dejemos que n + x sea el único argumento de nuestro programa monádico.
¡
es un rápido , lo que significa que consume algunos enlaces a su izquierda y los convierte en un enlace rápido . ¡
en particular consume uno o dos enlaces.
<F:monad|dyad><N:any>
llama al enlace N , devuelve r , y ejecuta F un total de r veces.
<nilad|missing><F:monad|dyad>
establece r en el último argumento de línea de comandos (o una entrada de STDIN en su ausencia) y ejecuta F un total de r veces.
Como 1
es un nilad (un enlace sin argumentos), se aplica el segundo caso, y +¡
se ejecutará +
n veces (un argumento no entero se redondea hacia abajo). Después de cada llamada a +
, el argumento izquierdo del enlace rápido se reemplaza con el valor de retorno, y el argumento derecho con el valor anterior del argumento izquierdo.
En cuanto a todo el programa, Ḟ
coloca la entrada, produciendo n ; luego _
reste el resultado de la entrada, produciendo ** x, que se convierte en el valor de retorno.
1+¡
luego llama +¡
, como se describió anteriormente, con el argumento izquierdo 1 = f (0 + x) y el argumento derecho x = f (-1 + x) , que calcula la salida deseada.