递归查找素数


17

递归素数是素数的序列,使得

p(1) = 2
p(n) = the p(n-1)th prime

这是一个示例,说明如何计算第四个递归素数。

p(4) = the p(3)th prime
p(3) = the p(2)th prime
p(2) = the p(1)th prime
p(1) = 2
p(2) = the 2nd prime
p(2) = 3
p(3) = the 3rd prime
p(3) = 5
p(4) = the 5th prime
p(4) = 11

您应该编写一个程序或函数,当给定n时,将输出第n个递归素数。

如果愿意,可以选择使用基于0的索引,在这种情况下,您必须在答案中指出。

这是因此目标是最大程度地减少字节数。


测试用例

1 -> 2
2 -> 3
3 -> 5
4 -> 11
5 -> 31
6 -> 127
7 -> 709
8 -> 5381
9 -> 52711

OEIS相关条目:OEIS A007097

Answers:


13

绿洲,3个字节

该程序是0索引的。码:

<q2

使用公式:a(n)= nth_prime(a(n-1)-1),基本情况为a(0)= 2

代码说明:

  2   = a(0)

<     # Decrement a(n - 1) to get a(n - 1) - 1
 q    # prime(a(n - 1) - 1)

在线尝试!



8

Mathematica,16个字节

Nest[Prime,1,#]&

匿名函数。将数字作为输入并返回数字作为输出。


5

果冻5 4字节

1个字节感谢@Dennis。

1ÆN¡

在线尝试!

说明

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.

您不需要
丹尼斯,

@Dennis因此,是否¡只接受nilads作为重复项,并且如果没有找到则默认输入?
PurkkaKoodari

<f><n>¡乐于接受单子或二元原子<n>。但是,如果<f>是尼拉德人,那一定是有问题的,因此将其解析为,<f>¡并采用最后一个输入(最后一个命令行参数,STDIN没有)<n>
丹尼斯,

5

JavaScript(ES6),71个字节

p=(n,x=1)=>n?p(n-1,(N=y=>x?N(++y,x-=(P=z=>y%--z?P(z):z==1)(y)):y)(1)):x

不用担心,您具有三个单独的递归函数:

P=(n,x=n)=>n%--x?P(n,x):x==1
N=(n,x=1)=>n?N(n-P(++x),x):x
p=(n,x=1)=>n?p(n-1,N(x)):x
  • P 确定是否 n素数;
  • N 找到 n素数;
  • pN在输入1 n时间上递归运行。

4

MATL,6个字节

1i:"Yq

在线尝试!

说明

1      % Push 1
i      % Input n
:      % Range [1 2 ... N]
"      % For each (that is, do the following N times)
  Yq   %   k-th prime, where k is the input
       % End for each (implicit)
       % Display stack (implicit)

3

R,98 93字节

5字节感谢@smci

这是一个效率极低的递归解决方案:

f<-function(m,n=1){j<-1;for(i in 1:n){j<-numbers::nextPrime(j)};a<-ifelse(m==0,j,f(m-1,j));a}

测试输出:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391

1
您可以通过这样做来剃掉一点a<-ifelse(m==0,j,f(m-1,j))
smci


@Giuseppe,您应该将其发布为答案……这是一个相当大的减少!!!我以前从未见过if像那样使用过……很酷!
约瑟夫·伍德

@JosephWood不,那只是标准的高尔夫;核心算法没有改变。我建议您阅读R中打高尔夫球的技巧,以获得一些更酷的高尔夫技巧(尽管通常它们是可怕的R风格)。
朱塞佩

2

Bash +通用工具,55

由于我们正在执行递归素数,因此有一个递归答案:

((SHLVL-2<$1))&&primes 2|sed -n "`$0 $1`{p;q}"||echo 1

由于递归级别计数基于$SHLVL内置变量,因此如果您已经有几个shell级别了,那么答案可能就不对了。这可能就是为什么此答案不适用于TIO的原因。


如果那不好,那么这是一个更常规的答案:

Bash +通用工具,58

for((i=$1;i--;));{
n=`primes 2|sed -n "$n{p;q}"`
}
echo $n

在线尝试


1

哈斯克尔,58个字节

1索引

f 1=2;f n=[x|x<-[2..],all((>)2.gcd x)[2..x-1]]!!(f(n-1)-1)

在线尝试!

说明:

使用与Adnan的答案相同的0索引素数列表访问技巧。
否则,基本上按照规范进行整理。

f 1=2; -- base case
f n= -- main case
    [x|x<-[2..],all((>)2.gcd x)[2..x-1]]             -- list of all primes
    [x|x<-[2..],                                     -- consider all numbers
                               [2..x-1]              -- consider all smaller numbers
                all((>)2.gcd x)                      -- is coprime with them?
                    (>)2.                            -- 2 is greater than
                         gcd x                       -- gcd(x,lambda input)
                                        !!(f(n-1)-1) -- access the
                                                     -- f(n-1)-th 1-indexed prime

1

05AB1E,4个字节

ÎF<Ø

在线尝试!

说明

ÎF<Ø
Î    # Push 0 and input
 F   # Do input times...
  <   # Decrement
   Ø  # Get the nth prime (0-indexed) with n being the top of the stack

0

奇迹,23字节

p\.{1\2@:^(- p -#0 1)1P

1个索引。用法:

p\.{1\2@:^(- p -#0 1)1P}; p 3

说明

p\.{                #. Pattern matching syntax
  1\2               #. Base case p(1)=2
  @:^(- p -#0 1)1P  #. Other cases p(n)=nthprime(p(n-1)-1)
                    #. nthprime is 0-indexed
}                   #. Trailing bracket is optional in this case
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.