我想打印一个图案:首先一个接一个地减少5,直到我们达到0或负数,然后我们增加5,直到我们达到n。
我试过这段代码,但它在10,5:
import Foundation
func printPattern(n : Int) {
if n <= 0 {
if n == n {
return
} else {
print(n)
printPattern(n: n + 5)
}
}
if n > 0 {
print(n)
printPattern(n: n - 5)
}
}
printPattern(n: 10)
我希望输出是10,5,0,5,10。
发布于 2019-08-04 21:49:17
这将是:
func printPattern(n : Int) {
if n <= 0 {
print(n)
}
else {
print(n)
printPattern(n: n - 5)
print(n)
}
}
因此,使用此调用:
printPattern(n: 10)
输出为:
10 5 0 5 10
第一次调用printPattern
会打印两个10
。
第二次调用printPattern
将打印两个5
。
对printPattern
的第三次也是最后一次调用将打印0
。
递归调用嵌套在每次调用中的两个打印之间,这就是您获取模式的方式。
调用顺序如下所示:
printPattern(n: 10)
print(10)
printPattern(n: 5)
print(5)
printPattern(n: 0)
print(0) // base case
print(5) // upon return
print(10) // upon return
你在你的函数中做错了什么?
您的函数似乎正在尝试根据当前值是正还是零/负来判断加/减5
的方向。这样做的问题是,您可能会陷入打印0
和5
不断切换方向的循环中。因为你通过了两个方向的5
,所以你需要一些其他的方式来表示增加与减少。
您的函数当前只是输出10, 5
,因为当您转到0
时,check if n == n
始终为真。它检查的是if 0 == 0
,而不是if 0 == 10
。如果要对照n
的原始值进行检查,则需要将其作为单独的输入进行传递。
这大致是您正在尝试的内容:
func printPattern(n: Int, decreasing: Bool = true, start: Int? = nil) {
// If there is no start value, use n
let start = start ?? n
// recursive base case
if n > start {
return
}
// if we're already increasing or we have reached zero/negative
// time to increase
if !decreasing || n <= 0 {
print(n)
printPattern(n: n + 5, decreasing: false, start: start)
} else {
// otherwise we are still decreasing
print(n)
printPattern(n: n - 5, decreasing: true, start: start)
}
}
printPattern(n: 10)
10 5 0 5 10
https://stackoverflow.com/questions/57347062
复制相似问题