Narayana-Zidek-Capell数


17

给定输入n,生成第nNarayana-Zidek-Capell数。最低字节获胜。

f(1)= 1,f(n)是上一层(n / 2)Narayana-Zidek-Capell项的总和。

测试用例:

f(1)=1

f(9)=42

f(14)=1308

f(15)=2605

f(23)=664299

12
欢迎来到编程难题和代码高尔夫球!这是一个不错的第一个挑战。尽管最终由您决定,但通常我们建议至少等待一周才能接受答案。尽早获得接受的答案可以向其他用户发送信号,表明挑战已经或多或少地结束了,这阻碍了他们参与。
Alex A.

Answers:


6

果冻,11 10字节

HĊrµṖ߀Sȯ1

在线尝试!

需要n作为参数,打印出结果。

说明

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

7

Ruby,34 32字节

这使用OEIS页面中的Narayana-Zidek-Cappell数字公式

编辑:感谢运算符和尼尔,使用运算符优先级摆脱了括号。

f=->x{x<4?1:2*f[x-1]-x%2*f[x/2]}

当然,您不需要括号x%2吗?
feersum '16

好吧,x%2*至少不要这样。
尼尔

@feersum和Neil谢谢你们
Sherlock9

先前的问题编辑建议公式为x<2?...,这使它更加清楚了,谢谢!
尼尔

6

Python 2,48 42 38 36字节

算法取自OEIS页面。n<3可能会更改为n<4无效。返回第nth个数字,其中n是一个正整数。

a=lambda n:n<3or 2*a(n-1)-n%2*a(n/2)

在线尝试


5

05AB1E,16字节

迭代解决方案05AB1E没有功能。

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

在线尝试


5

C,38

OEIS算法的翻译。这里没有足够的C代码!

f(n){return n<3?:2*f(n-1)-n%2*f(n/2);}

n<3?:(...)工作如何?
LegionMammal978 '16

2
这是一个GCC扩展(似乎也可以在clang中使用),如果缺少中间表达式,它会根据条件本身求值。有关更多详细信息,请参见相关的GCC页面此SO问题
owacoder

4

Python 3,67个字节

def f(n):
 x=1,
 for i in range(n):x+=sum(x[-i//2:]),
 print(x[-1])

通过参数接受输入并输出到STDOUT的函数。这是该定义的直接实现。

怎么运行的

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

在Ideone上尝试




2

Haskell,34个字节

f 1=1
f n=sum$f<$>[n-div n 2..n-1]

用法示例:f 14-> 1308

该定义的直接实现。


2

Java,63字节

int z(int n){return n<3?1:n%2>0?(2*z(n-1)-z(n/2)):(2*z(n-1));}

1

Go,63个字节

func f(i int) int{if(i<4){return 1};return 2*f(i-1)-i%2*f(i/2)}

几乎是C答案的直接端口


0

PHP,81字节

这是一个完整的程序,没有递归。可以用52个字节定义一个递归函数(可能有可能击败它),但这只是sherlock9答案的一个相当无聊的端口(如果您要求f(100)或更大,它就会出错),所以我提出了更长更有趣的版本

<?php for($i=$argv[1];$j=$i;$i--)for(;--$j*2>=$i;)$a[$j]+=$a[$i]?:1;echo$a[1]?:1;

引起许多(O [n])通知,但这很好。


O(n)通知???

通知是一种非关键错误类型,不会停止执行,通常在生产环境中会被忽略。每当您尝试获取数组中未声明的变量或未定义的偏移量的值时,都会收到通知。该程序尝试获取O [n]未定义偏移量的值(以及两个未声明的变量),因此您会收到O [n]通知。
user55641'7

0

R,55字节

x[1]=1;for(i in 2:10){x[i]=sum(x[i-1:floor(i/2)])};x[9]

变化10for循环,x[9]以获得取其指数用户希望。


这是一个54字节长的递归版本: f=function(n)ifelse(n<4,1,2*f(n-1)-n%%2*f(floor(n/2)))
DSkoog

0

JavaScript, 54 52

f=n=>Math.round(n<3?1:2*f(n-1)-n%2*f(parseInt(n/2)))

基于C的答案。

  • 使用parseInt代替节省了2个字节Math.floor

0

枫树,46 44字节

`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)))

用法:

> f:=n->`if`(n<4,1,2*f(n-1)-(n mod 2)*f(floor(n/2)));
> seq( f(i), i = 1..10 );
  1, 1, 1, 2, 3, 6, 11, 22, 42, 84

0

R,63个字节

f=function(n,a=0)if(n<2)1 else{for(i in n-1:(n%/%2))a=a+f(i);a}

a=0作为默认添加,因为它为我节省了两个花括号。函数根据需要递归调用自身。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.