Как правильно вызвать другую функцию внутри функции в swift? - PullRequest
0 голосов
/ 11 октября 2019

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

Задача состоит в том, чтобы одна функция печатала простые числа , а другая - для вычисления и проверки, является ли число простым. Я должен вызвать проверку, является ли число простым из функции печати простых чисел .

ниже - мой код:

Эта функция вычисляетявляется ли X: Int простым числом. Он установлен на логическое значение, потому что я должен печатать «true» или «false» в функции под ним.

func isPrime(_ x: Int) -> Bool {
    if(x%2 == 0 || x%3 == 0){
        if(x == 2 || x == 3){
            return(true)
        }
        return(false)
    }
    else{
        //if the number is less than or equal to 1, we'll say it's not prime
        if(x <= 1){
            return(false)
        }


  }
    return true
}

Эта часть вычисляет печать простого числа от 1 до n.

func PrintPrimes(upTo n: Int) {
    for x in 1...n {
        var count = 0
        for num in 1..<x {
            isPrime(x)
            count += 1

        }
        if count <= 1 {
            print(isPrime(x))
        }
    }
}

Эта часть выполняется только дважды, и я не совсем уверен, почему. Я не знаю, так ли это, потому что я не называю это правильно, или мне придется изменить некоторые вычисления.

Вся помощь приветствуется

РЕДАКТИРОВАТЬ:

Вот оригинальный printPrimes () , прежде чем я решил вызвать isPrime вфункция. Эта функция вычисляет только простые числа и печатает их до n.

func printPrimes(upTo n: Int) {
    for x in 1...n {
        var count = 0
        for num in 1..<x {
            if x % num == 0 {
                count += 1
        }

    }
        if count <= 1 {
            print(x)
        }
   }
}

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вы можете сделать это таким образом, в своих printPrimes вы можете зацикливаться до нужного вам числа и просто проверять, является ли число простым, вызывая функцию с номером. Но вы должны проверить свою функцию isPrime. Ваши printPrimes должны делать только то, что говорит его имя (печатать простые числа до n), и вся логика, чтобы проверить, должно ли число быть простым, должна быть в вашей функции isPrime. Также хорошей практикой является использование camelCase для функций, вы должны переименовать свою функцию в printPrimes вместо PrintPrimes.

func printPrimes(upTo n: Int) {
    for x in 1...n {
        if isPrime(x) {
            print(x)
        }
    }
}
1 голос
/ 11 октября 2019

Ваша вторая подпрограмма печатает только два значения, потому что она вызывает isPrime, но никогда не делает ничего условного для возвращаемого значения, а наоборот увеличивает count независимо от этого. И поскольку вы печатаете только, если count равно <= 1, это произойдет только для первых двух значений n.

Но предположим, что вы пытались напечатать простые числа доопределенное число, которое вы могли бы сделать:

func printPrimes(upTo n: Int) {
    for x in 1...n {
        if isPrime(x) {
            print(x)
        }
    }
}

(Условно говоря, в Swift, когда мы говорим «через n», мы повторяем 1...n, и если кто-то говорит «дона n ”, мы бы повторили 1..<n. Но поскольку ваш оригинальный фрагмент кода использует upTo в сочетании с 1...n, я буду использовать это здесь, но только заметьте, что это не очень соответствует стандартуШаблоны Swift API.)

К сожалению, isPrime также неверен. Так что вам придется сначала это исправить. Например, рассмотрим 25. Это не делится на 2 или 3, но также не является простым.

Если вы посмотрите на предоставленный оригинал printPrimes, то, по сути, он говорит:сколько целых целых чисел меньше x делится на x ... если делится только на одно другое число (а именно 1), то это простое число ». Эта логика, хотя и неэффективна, является правильной. Вы должны пойти дальше и использовать это в вашей isPrime рутине. Но эта логика «делится на 2 или 3» неверна.

...