如何在Swift中正确调用一个函数中的另一个函数?

时间:2019-10-11 16:43:27

标签: swift function swift-playground

我学的很快,我写了两个函数,并且自己尝试了两个函数,它们都很好用。但是,当我尝试在另一个函数中调用一个函数时,似乎无法获得所需的输出。

当前的任务是,一个功能应打印质数,而另一个功能应计算并检查该数字。我应该从打印质数函数中调用是否为质数

下面是我的代码:

此函数计算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 个答案:

答案 0 :(得分:1)

您的第二个例程仅打印两个值,因为它正在调用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,但是由于您的原始代码段结合了upTo1...n一起使用,因此我在这里使用它,但是请注意,这与标准Swift不太一致API模式。)

不幸的是,isPrime也不正确。因此,您必须先解决该问题。例如,考虑25。该数字不能被2或3整除,但也不是素数。

如果您查看提供的原始printPrimes,它的实际作用是说“ {{1}小于x的整数可以整除...再加上一个数字(即x),那么它就是一个质数。”这种逻辑虽然效率不高,但却是正确的。您应该继续在1例程中使用它。但是“被2或3整除”的逻辑是不正确的。

答案 1 :(得分:1)

您可以这样操作,在您的printPrimes中,您可以循环显示所需的数字,只需通过调用带有数字的函数来检查数字是否为质数。但是您必须检查isPrime函数。您的printPrimes应该只执行其名称上所说的(打印质数最大为n),并且所有检查该数字是否为质数的逻辑都应位于isPrime函数上。 在函数上使用camelCase也是一个好习惯,您应该将函数重命名为printPrimes而不是PrintPrimes。

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