Finden Sie rekursiv Prime Primes


17

Die rekursiven Primzahlen sind eine Folge von Primzahlen, so dass

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

Hier ist ein Beispiel, wie man die 4. rekursive Primzahl berechnen könnte.

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

Sie sollten ein Programm oder eine Funktion schreiben, die bei Angabe von n das n-te rekursive Prime Prime ausgibt.

Sie können die 0-basierte Indexierung verwenden, wenn Sie dies wünschen. In diesem Fall müssen Sie dies in Ihrer Antwort angeben.

Dies ist also ist das Ziel, Ihre Byteanzahl zu minimieren.


Testfälle

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

Relevanter OEIS-Eintrag: OEIS A007097

Antworten:


13

Oase , 3 Bytes

Das Programm ist 0-indiziert . Code:

<q2

Verwendet die Formel: a (n) = nth_prime (a (n-1) - 1) , wobei der Basisfall a (0) = 2 ist .

Code Erklärung:

  2   = a(0)

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

Probieren Sie es online!



8

Mathematica, 16 Bytes

Nest[Prime,1,#]&

Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine Zahl als Ausgabe zurück.


5

Gelee , 5 4 Bytes

1 Byte dank @Dennis.

1ÆN¡

Probieren Sie es online!

Erläuterung

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

Das brauchst du nicht .
Dennis

@Dennis Akzeptiert also ¡nur Nilads als Wiederholungen und standardmäßig Eingaben, wenn keine gefunden werden?
PurkkaKoodari

<f><n>¡Akzeptiert gerne monadische oder dyadische Atome für <n>. Wenn <f>es sich jedoch um ein Nilad handelt, muss etwas falsch sein. <f>¡Daher wird es stattdessen als geparst und verwendet die letzte Eingabe (letztes Befehlszeilenargument, STDIN gibt es keine) als <n>stattdessen.
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

Ungolfed, Sie haben drei separate rekursive Funktionen:

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
  • Pbestimmt, ob nprim ist;
  • Nfindet die nth prime;
  • pLäuft rekursiv Nauf Eingabezeiten 1 n.

4

MATL , 6 Bytes

1i:"Yq

Probieren Sie es online!

Erläuterung

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 Bytes

5 Bytes dank @smci

Hier ist eine schrecklich ineffiziente rekursive Lösung:

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}

Testausgang:

f(6)
[1] 127

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

1
Sie können sich ein wenig abschneiden, indem Siea<-ifelse(m==0,j,f(m-1,j))
smci


@ Giuseppe, das solltest du als Antwort posten ... das ist ein deutlicher Rückgang !!! Ich habe noch nie so ifgebraucht gesehen ... ziemlich cool !!
Joseph Wood

@JosephWood nah, das sind nur Standardgolfs; Der Kernalgorithmus hat sich nicht geändert. Ich würde vorschlagen, Tipps zum Golfen in R zu lesen, um ein paar coolere Golftipps zu erhalten (obwohl sie normalerweise einen fürchterlichen R-Stil haben).
Giuseppe

2

Bash + gemeinsame Dienstprogramme, 55

Da wir rekursive Primzahlen verwenden, ist hier eine rekursive Antwort:

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

Da die Zählung der Rekursionsebenen auf der $SHLVLintegrierten Variablen basiert , kann die Antwort deaktiviert sein, wenn Sie bereits einige Shell-Ebenen tief sind. Dies ist wahrscheinlich der Grund, warum diese Antwort bei TIO nicht funktioniert.


Wenn das nicht gut ist, dann ist hier eine konventionellere Antwort:

Bash + gemeinsame Dienstprogramme, 58

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

Probieren Sie es online aus .


1

Haskell , 58 Bytes

1-indiziert

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

Probieren Sie es online!

Erläuterung:

Verwendet den gleichen 0-indizierten Prime-List-Zugriffstrick wie Adnans Antwort .
Im Wesentlichen folgt Straight-Up ansonsten der Spezifikation.

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

Wunder , 23 Bytes

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

1-indiziert. Verwendung:

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

Erläuterung

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.