F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b
Спробуйте в Інтернеті!
Дійсно для всіх значень (за потребою), але загалом не для (виводить для непарних с.) Код модифікується, щоб зменшити один байт, змінивши вихід на де визначено нижче. Зокрема, формула повторення для єEnF(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
Спробуйте в Інтернеті!
З подивом не знайшов відповіді на JavaScript, тому спробую.
Код складається лише з базової математики, але математика за кодом вимагає обчислення. Формула рекурсії походить від розширення похідних різних порядків.sech(x)
Пояснення
Тут я використаю зручні позначення. Нехай і . Тоді маємоTn:=tanhn(t)Sn:=sechn(t)
dnSdtn=∑i=0nF(n,i)Tn−iSi+1
Оскільки та , ми можемо зробити висновок, щоdTdt=S2dSdt=−TS
ddt(TaSb)=aTa−1(S2)(Sb)+bSb−1(−TS)(Ta)=aTa−1Sb+2−bTa+1Sb
Нехай і , ми можемо переписати відношення вище якb=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
Тобто сприяє як і . В результаті ми можемо записати через і :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)
з початковою умовою і де .F(0,0)=1F(0,i)=0i≠0
Пов'язана частина коду a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
точно розраховується за допомогою наведеної вище формули повторення. Ось поділка:
-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)
Оскільки і , дорівнює коефіцієнту при розширенні , яке .T(0)=0S(0)=1EnSn+1dnSdtnF(n,n)
Для гілок, яких ніколи не можна досягти, повторення завжди закінчуються на 0, тому де або непарне. Останнє, зокрема, означає, що для всіх непарних s. Якщо навіть s суворо більший за , повторення може врешті-решт дозволити статися в якийсь момент, але перед цим кроком він повинен досягти точки, де , і формула повторення показує, що значення повинно бути 0 у цій точці (оскільки перший доданок множимо на , а другий член - далі від "трикутника"F(0,0)F(n,i)=0i<0iEn=0nin0≤i≤ni=n+1n−i+1=n−(n+1)+1=00≤i≤n). У результаті де . Це завершує доведення достовірності алгоритму.F(n,i)=0i>n
Розширення
Код можна модифікувати для обчислення ще трьох споріднених послідовностей:
Дотичні числа (46 байт)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!~b
Секретні числа (45 байт)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
Зігзагові цифри Ейлера (48 байт)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b
-i/2
, які отримують-i
при додаванні. Помножте це наi
зовнішню суму підсумовування, і ви отримаєте1
.