F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b
Pruébalo en línea!
Válido para todos los valores (según se requiera), pero no para generalmente (salidas para impar s.) Se modifica el código para reducir un byte cambiando la salida a donde se define como a continuación. Específicamente, la fórmula de recurrencia para esEnF(n,i)−F(n,i)nF′(n,i)=(−1)nF(n,i)FF′F′(n,i)=(i−n−1)F′(n−1,i−2)+(i+1)F′(n−1,i)
F=(a,b=a)=>a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
Pruébalo en línea!
Sorprendido de no encontrar una respuesta de JavaScript todavía, así que intentaré.
El código consiste solo en matemáticas básicas, pero las matemáticas detrás del código requieren cálculo. La fórmula de recursión se deriva de la expansión de las derivadas de de diferentes órdenes.sech(x)
Explicación
Aquí usaré alguna notación conveniente. Deje y . Entonces tenemosTn:=tanhn(t)Sn:=sechn(t)
dnSdtn=∑i=0nF(n,i)Tn−iSi+1
Como y , podemos deducir quedTdt=S2dSdt=−TS
ddt(TaSb)=aTa−1(S2)(Sb)+bSb−1(−TS)(Ta)=aTa−1Sb+2−bTa+1Sb
Sea y , podemos reescribir la relación anterior comob=i+1a=n−i
ddt(Tn−iSi+1)=(n−i)Tn−i−1Si+3−(i+1)Tn−i+1Si+1=(n−i)T(n+1)−(i+2)S(i+2)+1−(i+1)T(n+1)−iSi+1
Es decir, contribuye tanto a como a . Como resultado, podemos escribir en términos de y :F(n,i)F(n+1,i+2)F(n+1,i)F(n,i)F(n−1,i−2)F(n−1,i)
F(n,i)=(n−i+1)F(n−1,i−2)−(i+1)F(n−1,i)
con condición inicial y donde .F(0,0)=1F(0,i)=0i≠0
La parte relacionada del código a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
se calcula exactamente utilizando la fórmula de recurrencia anterior. Aquí está el desglose:
-F(--a,b) // -F(n-1, i) [ a = n-1, b = i ]
*++b // *(i+1) [ a = n-1, b = i+1 ]
+F(a,b-=3) // +F(n-1, i-2) [ a = n-1, b = i-2 ]
*(a-b) // *((n-1)-(i-2)) [ a = n-1, b = i-2 ]
// which is equivalent to *(n-i+1)
Como y , es igual al coeficiente de en la expansión de , que es .T(0)=0S(0)=1EnSn+1dnSdtnF(n,n)
Para las ramas en las que nunca se puede alcanzar , las recurrencias siempre terminan en 0, por lo que donde o es impar. El último, particularmente, implica que para todos los impares . Para aún S estrictamente mayor que , la recurrencia puede eventualmente permitir que suceda en algún momento, pero antes de que el paso que debe alcanzar un punto donde , y la fórmula de recurrencia muestra que la el valor debe ser 0 en ese punto (ya que el primer término se multiplica por , y el segundo término está más lejos del "triángulo" deF(0,0)F(n,i)=0i<0iEn=0nin0≤i≤ni=n+1n−i+1=n−(n+1)+1=00≤i≤n) Como resultado, donde . Esto completa la prueba de la validez del algoritmo.F(n,i)=0i>n
Extensiones
El código se puede modificar para calcular tres secuencias más relacionadas:
Números de tangente (46 bytes)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!~b
Números Secantes (45 bytes)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
Números en zigzag de Euler (48 bytes)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b
-i/2
, que producen-i
cuando se agregan. Multiplique eso por eli
exterior de la suma y obtendrá1
.