我学的很快,我写了两个函数,并且自己尝试了两个函数,它们都很好用。但是,当我尝试在另一个函数中调用一个函数时,似乎无法获得所需的输出。
当前的任务是,一个功能应打印质数,而另一个功能应计算并检查该数字。我应该从打印质数函数中调用是否为质数。
下面是我的代码:
此函数计算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)
}
}
}
答案 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
,但是由于您的原始代码段结合了upTo
和1...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)
}
}
}