Как создать функцию, которая дает простое число + значение bool? - PullRequest
0 голосов
/ 31 мая 2019

Со вчерашнего дня я борюсь с этим, как создать функцию, которая имеет список простых чисел и возвращает "простое число + true / false", например:

2 true 3 true 4 false 5 true

это в Swift 5, первый функционал с именем primecheck работает отлично, проблема во втором PrimeList

func primecheck (numbers:Int) -> Bool{ 

    var prime = true

    if numbers == 1 || numbers == 0 || numbers == 2{
        prime = true

    }
    if numbers > 2{
        for i in 2...numbers - 1{
            if numbers % i == 0 {
                prime = false

            }

        }
    }
    if numbers == 1 || numbers == 0 || numbers == 2{
        prime = true

    }

    if numbers < 0{
        prime = false
    }
    return prime
}


func PrimeList(maxP:Int) -> [(num1:Int, num2:Bool)] {


    var primes: [(num1:Int, num2:Bool)] = []

    for i in 1...maxP {

        if primecheck(numbers:i){
            print(i)
            primes[i - 1] = (i, true)

        } else {
            primes[i - 1] = (i, false)
        }
    }
  //  isPrime[0] = true
  //  isPrime[1] = true

    return primes
}

print(PrimeList(maxP:20))

ожидаемый результат:

print(primeList(maxP:20))
// 2 true
// 3 true

// 4 false
...
// 20 false

но всегда появляется эта ошибка:

Выполнение было прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0).

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Ваша программа падает, потому что вы не можете индексировать пустой массив в Swift.Вы должны использовать append для добавления элементов в ваш массив.

Вместо создания массива путем добавления элементов, это идеальное место для использования map:

func primeList(maxP: Int) -> [(num1: Int, num2: Bool)] {
    return (1...maxP).map { ($0, primecheck(numbers: $0)) }
}

Объяснение:

map создает массив.В этом случае он берет каждый элемент из диапазона (1...maxP) и преобразует его, используя предоставленное замыкание, в кортеж исходного значения и результат вызова primecheck с этим значением.Результатом является требуемый массив с сопряжением значений с bools, указывающими, являются ли они простыми.


Ваша функция primecheck может быть очищена с помощью guard для немедленного return false для чиселне более 1.Вы можете сразу же return false, если найдете число, которое равномерно делит ввод, в противном случае return true, если ничего не найдено.

func primecheck (numbers:Int) -> Bool {
    guard numbers > 1 else { return false }

    for i in 2..<numbers {
        if numbers % i == 0 {
            return false
        }
    }

    return true
}

Примечания:

  1. Вы можете дополнительно оптимизировать primecheck, отказавшись от проверки на делитель, когда i * i > numbers.Добавьте guard i * i <= numbers else { return true } вверху цикла for.В качестве альтернативы, установите верхний предел диапазона делителей на Int(sqrt(Double(numbers))).
  2. 2...numbers - 1 был переписан как 2..<numbers.
  3. Имена функций должны начинаться со строчной буквы.
0 голосов
/ 31 мая 2019

Вы можете использовать map или reduce(into:_:) методы для генерации массива кортежей primeList.

Использование reduce(into:_:)

func primeList(maxP:Int) -> [(num1:Int, num2:Bool)] {
    return (1...maxP).reduce(into: [(num1:Int, num2:Bool)](), { $0.append((num1:$1, num2:primecheck(number:$1))) })
}

И вам не нужно проверять до n-1, чтобы определить, является ли число простым или нет.Вы можете проверить до square root из n

func primecheck(number: Int) -> Bool {
    if number < 2 { return false }
    if 2...3 ~= number { return true }
    return !(2...Int(sqrt(Double(number)))).contains { number % $0 == 0 }
}
0 голосов
/ 31 мая 2019

См. Приведенный ниже ответ, если это может иметь смысл для вас:

func isPrime(_ number: Int) -> String {

    return "\(number) \(number > 1 && !(2..<number).contains { number % $0 == 0 })"
}

func PrimeList(maxP:Int) {
    var array = [String]()
    for number in 0...maxP {
        array.append(isPrime(number))
    }
    print(array)
}

Метод вызова:

PrimeList (maxP: 20)

Ответы:

["0 ложных", "1 ложных", "2 верных", "3 верных", "4 ложных", "5 верных", "6false "," 7 true "," 8 false "," 9 false "," 10 false "," 11 true "," 12 false "," 13 true "," 14 false "," 15 false "," 16false "," 17 true "," 18 false "," 19 true "," 20 false "]

...