Temukan Prime Primes secara rekursif

17

Prime Primes yang rekursif adalah urutan bilangan prima sedemikian rupa

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

Berikut adalah contoh bagaimana seseorang dapat menghitung Prime Prime 4 secara rekursif.

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

Anda harus menulis sebuah program atau fungsi yang ketika diberikan n, menghasilkan Prime Prime yang rekursif.

Anda dapat memilih untuk menggunakan pengindeksan berbasis 0 jika Anda ingin dalam hal ini Anda harus menunjukkannya dalam jawaban Anda.

Ini adalah sehingga tujuannya adalah untuk meminimalkan jumlah byte Anda.


Uji Kasus

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

Entri OEIS yang relevan: OEIS A007097

Posting Rock Garf Hunter
sumber

Jawaban:

13

Oasis , 3 byte

Program ini diindeks 0 . Kode:

<q2

Menggunakan rumus: a (n) = nth_prime (a (n-1) - 1) , dengan case dasar a (0) = 2 .

Penjelasan kode:

  2   = a(0)

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

Cobalah online!

Adnan
sumber
8

Sebenarnya , 7 byte

1@⌠DP⌡n

Cobalah online!

Penjelasan:

1@⌠DP⌡n
1        push 1
 @       swap 1 with n
  ⌠DP⌡n  do the following n times:
   DP      decrement, prime at index
Mego
sumber
8

Mathematica, 16 byte

Nest[Prime,1,#]&

Fungsi anonim. Mengambil nomor sebagai input dan mengembalikan nomor sebagai output.

LegionMammal978
sumber
5

Jelly , 5 4 byte

Terima kasih 1 byte ke @Dennis.

1ÆN¡

Cobalah online!

Penjelasan

1        Starting with n = 1,
 ÆN      replace n by the nth prime
   ¡     (input) times.
PurkkaKoodari
sumber
Anda tidak membutuhkannya .
Dennis
@ Dennis Jadi, apakah ¡hanya menerima nilad sebagai pengulangan dan default untuk input jika tidak ada yang ditemukan?
PurkkaKoodari
<f><n>¡dengan senang hati menerima atom monadik atau diad <n>. Namun, jika <f>nilad, sesuatu pasti salah, sehingga diurai sebagai <f>¡gantinya dan mengambil input terakhir (argumen baris perintah terakhir, STDIN tidak ada) sebagai <n>gantinya.
Dennis
5

JavaScript (ES6), 71 byte

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

Tidak dikelompokkan, Anda memiliki tiga fungsi rekursif terpisah:

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
  • Pmenentukan apakah nprime;
  • Nmenemukan nperdana th;
  • pberjalan secara rekursif Npada 1 nwaktu input .
Produksi ETH
sumber
4

MATL , 6 byte

1i:"Yq

Cobalah online!

Penjelasan

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)
Luis Mendo
sumber
3

R, 98 93 byte

5 byte berkat @smci

Berikut ini adalah solusi rekursif yang sangat tidak efisien:

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}

Hasil tes:

f(6)
[1] 127

f(10)        ### takes almost a minute... YIKES!!!
[1] 648391
Joseph Wood
sumber
1
Anda dapat mencukur sedikit dengan melakukana<-ifelse(m==0,j,f(m-1,j))
smci
1
74 byte
Giuseppe
@ Giuseppe, Anda harus memposting itu sebagai jawaban ... itu adalah penurunan yang cukup besar !!! Aku belum pernah melihat ifbekas seperti itu sebelumnya ... sangat keren !!
Joseph Wood
@ JosephephWood nah, itu hanya golf standar; algoritma inti tidak berubah. Saya sarankan membaca tips untuk bermain golf di R untuk beberapa tips bermain golf yang lebih keren (walaupun biasanya gaya R yang mengerikan).
Giuseppe
2

Bash + utilitas umum, 55

Karena kita sedang melakukan bilangan prima rekursif, inilah jawaban rekursif:

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

Karena penghitungan level rekursi didasarkan dari $SHLVLvariabel bawaan, maka jawabannya bisa tidak aktif jika Anda sudah memiliki beberapa level shell. Ini mungkin mengapa jawaban ini tidak berfungsi pada TIO.


Jika itu tidak baik, maka inilah jawaban yang lebih konvensional:

Bash + utilitas umum, 58

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

Cobalah online .

Trauma Digital
sumber
1

Haskell , 58 byte

1-diindeks

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

Cobalah online!

Penjelasan:

Menggunakan trik akses daftar-prima yang diindeks sama seperti jawaban Adnan .
Pada dasarnya straight-up mengikuti spesifikasi sebaliknya.

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
SEJPM
sumber
1

05AB1E , 4 byte

ÎF<Ø

Cobalah online!

Penjelasan

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

Bertanya-tanya , 23 byte

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

1-diindeks. Pemakaian:

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

Penjelasan

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
Mama Fun Roll
sumber