swift - 在 Swift 中使用递归打印模式

标签 swift recursion

我想打印一个模式:首先将 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 的方向。这样做的问题是你会进入打印 05 不断切换方向的循环。由于您向两个方向传递了 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/

相关文章:

ios - Swift 从父类(super class)函数中相应的子类调用类函数

java - 如何列出 Java 类及其祖先在 Eclipse 中公开的所有属性?

typescript - 是否可以在 typescript 中递归地将一种类似 JSON 的类型映射到另一种类型?

c++ - 我在给定程序中哪里错了?

swift - 模拟 UNNotificationResponse 和 UNNotification(以及其他带有 init() 标记为不可用的 iOS 平台类)

ios - 不同类型的 Json 属性

macos - swift 2 : Can't call createDirectoryAtUrl with definition

ios - 快速缩放 View Controller

c - 如何将剩余的 for 循环更改为递归函数?

python - 分布的迭代排列