了解快速功能

时间:2017-02-07 16:49:32

标签: swift

我正在学习swift,我想知道为什么要遵循以下代码:

func isNumberDivisible(_ number: Int, by divior: Int) -> Bool {

    if number % divior == 0 {
        return true;
    }   else {
        return false;
    }
}

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

    var isPrimeNumber = false

    for index in 0..<number {

        if (isNumberDivisible(number, by:index )) {
            isPrimeNumber = false
        }   else {
            isPrimeNumber = true
        }
    }

    return isPrimeNumber
}

isPrime(10)

输出错误 - 执行被中断,EXC_BAD_INSTRUCTION ..

2 个答案:

答案 0 :(得分:4)

您的for loop从零开始。这是一个毫无意义的测试,检查你是否可以除以1。

您应该以2

开始索引
for index in 2..<number {

一旦你发现它不是一个素数,你应该停止 - 这个函数实际打印出来的是这个数字是否可以被(数字 - 1)整除。正如@rmaddy指出的那样,你不需要检查每个数字 - 在你的例子中10可以被2和5整除 - 但你不需要检查5,因为你将在2上失败

for index in 2..<Int(sqrt(Double(number))) {

        if (isNumberDivisible(number, by:index )){
            isPrimeNumber = false
            break
        }   else{
            isPrimeNumber = true
        }
    }

答案 1 :(得分:3)

  • 余数运算符(%)执行除法
  • 第一个索引是0
  • number % divior执行10/0

除以零会导致运行时错误。

顺便说一句,第一个素数是2

for index in 2..<number

并且您的算法无论如何都无效。