Как создать цикл, который возвращает первые N простых чисел в векторе? - PullRequest
2 голосов
/ 28 марта 2019

Я уже некоторое время пытаюсь написать функцию с двумя аргументами. Один целое число = n, а другой логический аргумент. Как написать функцию, которая бы возвращала либо первые n простых чисел в векторе, если логический аргумент равен true, либо n-е простое число, если логический аргумент равен false?

Это насколько я получил.

getprime <- function(n=0 , all=TRUE) {
    if (n<=0) {
    print("Not a valid number") 

    } else if (n>0) {
        for (primen in 1:n) {
         while (n %% 2:(n-1) == 0) {
        n=n+1
        print(n)
    }   
    }
    }
    print(n)
}

Результаты, которые должны отображаться, показаны ниже.

> genprime(7, all=TRUE)
[1] 2 3 5 7 11 13 17
> genprime(7, all=FALSE)
[1] 17

1 Ответ

1 голос
/ 28 марта 2019

Вы можете написать рекурсивную функцию (функцию, которая вызывает себя). В дополнение к двум аргументам n и all также потребуются счетчик i и (пустой) вектор простых чисел primes.

До тех пор, пока число найденных простых чисел меньше n, функция вызывает себя и при каждом вызове сама увеличивает счетную переменную i. Если i - простое число, оно добавляется к вектору primes.

get_prime <- function(n, all = TRUE, i = 1, primes = c()){
  if ( n <= 0) {
    stop("Not a valid number")
  }

  if (length(primes) < n) {
    if (i == 2L || all(i %% 2L:ceiling(sqrt(i)) != 0)) {
      get_prime(n, all = all, i = i + 1, primes = c(primes, i))
    } else {
      get_prime(n, all = all, i = i + 1, primes = primes)
    }
  } else {
    if (all) {
      return(primes)
    } else {
      return(tail(primes, 1))
    }
  }
}

Результаты:

get_prime(7, TRUE)
[1]  2  3  5  7 11 13 17
get_prime(7, FALSE)
[1] 17
...