재귀 적으로 프라임 프라임 찾기


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

답변:




8

매스 매 티카, 16 바이트

Nest[Prime,1,#]&

익명의 기능. 숫자를 입력으로 받아서 숫자를 출력으로 반환합니다.


5

젤리 , 5 4 바이트

@Dennis 덕분에 1 바이트.

1ÆN¡

온라인으로 사용해보십시오!

설명

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

필요하지 않습니다 .
Dennis

¡@Dennis 그래서 nilads 만 반복으로 받아들이고 아무것도 발견되지 않으면 기본적으로 입력합니까?
PurkkaKoodari

<f><n>¡에 대한 단원 자 또는 이원자 원자를 행복하게 받아들입니다 <n>. 그러나 <f>nilad 인 경우 무언가 잘못되었으므로 <f>¡대신 구문 분석되고 마지막 입력 (마지막 명령 줄 인수, STDIN이 없음)을 <n>대신 사용합니다.
Dennis

5

자바 스크립트 (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

Ungolfed에는 세 가지 별도의 재귀 함수가 있습니다.

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
  • Pn프라임 여부를 결정합니다 .
  • Nn번째 소수를 찾습니다 .
  • pN입력 1 n시간 에 재귀 적으로 실행 됩니다 .


3

R, 98 93 바이트

@smci 덕분에 5 바이트

끔찍하게 비효율적 인 재귀 솔루션은 다음과 같습니다.

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


@ 주세페, 당신은 대답으로 그것을 게시해야합니다 ... 그것은 상당히 감소합니다 !!! 나는 if이전에 그런 식으로 사용 된 적이 없다 ... 꽤 멋지다!
Joseph Wood

@JosephWood nah, 그들은 표준 골프입니다; 핵심 알고리즘은 변경되지 않았습니다. 좀 더 멋진 골프 팁을 얻으려면 R에서 골프 팁을 읽는 것이 좋습니다 (보통 끔찍한 R 스타일이지만).
Giuseppe

2

배쉬 + 공통 유틸리티, 55

우리는 재귀 소수를 수행하기 때문에 재귀 적 답변이 있습니다.

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

재귀 수준 계산은 기본 제공 $SHLVL변수를 기반으로하므로 이미 몇 개의 셸 수준에있는 경우 답변을 해제 할 수 있습니다. 이것이 아마도이 답변이 TIO에서 작동하지 않는 이유 일 것입니다.


그것이 좋지 않으면 여기에 더 일반적인 대답이 있습니다.

배쉬 + 공통 유틸리티, 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


0

Wonder , 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.