Oluşturmak n inci Narayana-Zídek-Capell bir giriş belirli sayıda n . En az bayt kazanır.
f (1) = 1, f (n), önceki kat (n / 2) Narayana-Zidek-Capell terimlerinin toplamıdır.
Test Durumları:
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
Oluşturmak n inci Narayana-Zídek-Capell bir giriş belirli sayıda n . En az bayt kazanır.
f (1) = 1, f (n), önceki kat (n / 2) Narayana-Zidek-Capell terimlerinin toplamıdır.
Test Durumları:
f(1)=1
f(9)=42
f(14)=1308
f(15)=2605
f(23)=664299
Yanıtlar:
HĊrµṖ߀Sȯ1
Alır n argüman olarak ve sonucu yazdırır.
H divide input by 2
Ċ round up to get first n to recurse
r inclusive range from that to n
µ (chain separator)
Ṗ remove n itself from the range
߀ call self recursively on each value in the range
S sum results
ȯ1 if sum was zero, return one
Bu, OEIS sayfasındaki bir formül Narayana-Zidek-Cappell sayıları için OEIS .
Düzenleme: Feersum ve Neil sayesinde operatör önceliğini kullanarak parantezlerden kurtuldum.
f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}
x%2mu?
x%2*En azından koyarsan olmaz .
x<2?... bu çok daha net olmasını sağladı!
OEIS sayfasından alınan algoritma. etkisiz n<3olarak değiştirilebilir n<4. Pozitif bir tam sayı olan nth sayısını döndürür n.
a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)
05AB1E olarak yinelemeli bir çözümün işlevleri yoktur.
X¸sGDN>;ï£Os‚˜}¬
X¸ # initialize a list with 1
sG } # input-1 number of times do
D # duplicate current list
N>;ï£ # take n/2 elements from the list
O # sum those elements
s‚˜ # add at the start of the list
¬ # get the first element and implicitly print
OEIS algoritmasının çevirisi. Buralarda yeterli C kodu yok!
f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}
n<3?:(...)çalışır?
def f(n):
x=1,
for i in range(n):x+=sum(x[-i//2:]),
print(x[-1])
Bağımsız değişken üzerinden girdi alan ve STDOUT'a yazdırılan bir işlev. Bu, tanımın doğrudan bir uygulamasıdır.
Nasıl çalışır
def f(n): Function with input target term index n
x=1, Initialise term list x as tuple (1)
for i in range(n):... For all term indices in [0,n-1]...
x[-i//2:] ..yield the previous floor(i/2) terms...
x+=sum(...) ...and append their sum to x
print(x[-1]) Print the last term in x, which is the nth term
L|syM>/b2Ub1
Çevrimiçi deneyin. Test odası.
Th Narayana-Zidek-Capell-sayısını y(n)döndüren bir işlevi tanımlar n.
If[#<4,1,2#0[#-1]-#~Mod~2#0[(#-1)/2]]&
Anonim işlev. 𝑛 değerini girdi olarak alır ve 𝑓 (𝑛) değerini çıktı olarak döndürür. Ruby çözümüne dayanmaktadır.
int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}
Bu özyineleme olmadan tam bir programdır. Özyinelemeli bir işlev 52 bayt olarak tanımlanabilir (bunu yenmek mümkün olabilir) ama bu sadece sherlock9'un cevabının oldukça sıkıcı bir limanıdır (ve f (100) veya daha fazlasını isterseniz hata yapar), bu yüzden bunu koyuyorum daha uzun ve daha ilginç versiyon
<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;
Birçok (O [n]) bildirime neden olur, ancak bu iyi.
O(n)bildirimler? Ha?
x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]
Değişim 10içinde fordöngü ve x[9]kullanıcı istediği hangisi endeksi alır.
f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))
Dayanarak C cevap.
parseIntyerineMath.floorf=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}
a=0varsayılan olarak eklenir, çünkü bana iki kıvırcık parantez kaydeder. İşlev, kendisini gerektiği gibi yinelemeli olarak çağırır.