我想打印一个模式:首先将 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。
最佳答案
那就是:
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
时,检查 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
关于swift - 在 Swift 中使用递归打印模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57347062/