F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b
Experimente online!
Válido para todos En valores (conforme necessário), mas não para F( n , i ) geralmente (saídas - F( n , i ) para estranho ns.) O código é modificado para reduzir um byte, alterando a saída para F′( n , i ) = ( - 1 )nF( n , i ) Onde Fé definido como abaixo. Especificamente, a fórmula de recorrência paraF′ é 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
Experimente online!
Surpreso por não encontrar resposta em JavaScript ainda, então tentarei.
O código consiste apenas em matemática básica, mas a matemática por trás do código requer cálculo. A fórmula de recursão deriva da expansão dos derivativos des e c h (x) de ordens diferentes.
Explicação
Aqui vou usar alguma notação conveniente. DeixeiTn: = t a n hn( T ) e Sn: = s e c hn( T ). Então nós temos
dnSdtn= ∑i = 0nF( n , i ) Tn - iSi + 1
Desde a dTdt= S2 e dSdt= - TS, podemos deduzir que
ddt( TumaSb)= a Ta - 1( S2) ( Sb) + b Sb - 1( - TS) ( Tuma)= a Ta - 1Sb + 2- b Ta + 1Sb
Deixei b = i + 1 e a = n - i, podemos reescrever a relação acima como
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
Isso é, F( n , i ) contribui para ambos F( n + 1 , i + 2 ) e F( n + 1 , i ). Como resultado, podemos escreverF( n , i ) em termos de F( n - 1 , i - 2 ) e F( n - 1 , i ):
F( n , i ) = ( n - i + 1 ) F( n - 1 , i - 2 ) - ( i + 1 ) F( n - 1 , i )
com condição inicial F( 0 , 0 ) = 1 e F( 0 , i ) = 0 Onde i ≠ 0.
A parte relacionada do código a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
é exatamente calculada usando a fórmula de recorrência acima. Aqui está o detalhamento:
-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)
Desde a T( 0 ) = 0 e S( 0 ) = 1, En é igual ao coeficiente de Sn + 1 na expansão de dnSdtn, qual é F( n , n ).
Para galhos que F( 0 , 0 ) nunca pode ser alcançado, as recorrências sempre terminam em 0, então F( n , i ) = 0 Onde i < 0 ou Eué estranho. Este último, particularmente, implica queEn= 0 para todos ímpares ns. Por atéEus estritamente maior que n, a recorrência pode eventualmente permitir 0 ≤ i ≤ n acontecer em algum momento, mas antes desse passo ele deve chegar a um ponto em que i = n + 1, e a fórmula de recorrência mostra que o valor deve ser 0 nesse ponto (já que o primeiro termo é multiplicado por n - i + 1 = n - ( n + 1 ) + 1 = 0e o segundo termo está mais distante do "triângulo" de 0 ≤ i ≤ n) Como um resultado,F( n , i ) = 0 Onde i > n. Isso completa a prova da validade do algoritmo.
Extensões
O código pode ser modificado para calcular mais três seqüências relacionadas:
Números tangentes (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 em ziguezague de Euler (48 bytes)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b
-i/2
, que produzem-i
quando adicionados. Multiplique isso peloi
exterior do somatório e você obtém1
.