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

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!



8

Mathematica, 16 byte

Nest[Prime,1,#]&

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


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.

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 .

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)

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

1
Anda dapat mencukur sedikit dengan melakukana<-ifelse(m==0,j,f(m-1,j))
smci


@ 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 .


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.