diff --git a/codes/swift/Package.swift b/codes/swift/Package.swift index b57e7839..18c0bc21 100644 --- a/codes/swift/Package.swift +++ b/codes/swift/Package.swift @@ -6,6 +6,8 @@ let package = Package( name: "HelloAlgo", products: [ // chapter_computational_complexity + .executable(name: "iteration", targets: ["iteration"]), + .executable(name: "recursion", targets: ["recursion"]), .executable(name: "time_complexity", targets: ["time_complexity"]), .executable(name: "worst_best_time_complexity", targets: ["worst_best_time_complexity"]), .executable(name: "space_complexity", targets: ["space_complexity"]), @@ -94,6 +96,8 @@ let package = Package( .target(name: "graph_adjacency_list_target", dependencies: ["utils"], path: "chapter_graph", sources: ["graph_adjacency_list_target.swift"], swiftSettings: [.define("TARGET")]), .target(name: "binary_search_insertion_target", path: "chapter_searching", sources: ["binary_search_insertion_target.swift"], swiftSettings: [.define("TARGET")]), // chapter_computational_complexity + .executableTarget(name: "iteration", path: "chapter_computational_complexity", sources: ["iteration.swift"]), + .executableTarget(name: "recursion", path: "chapter_computational_complexity", sources: ["recursion.swift"]), .executableTarget(name: "time_complexity", path: "chapter_computational_complexity", sources: ["time_complexity.swift"]), .executableTarget(name: "worst_best_time_complexity", path: "chapter_computational_complexity", sources: ["worst_best_time_complexity.swift"]), .executableTarget(name: "space_complexity", dependencies: ["utils"], path: "chapter_computational_complexity", sources: ["space_complexity.swift"]), diff --git a/codes/swift/chapter_computational_complexity/iteration.swift b/codes/swift/chapter_computational_complexity/iteration.swift new file mode 100644 index 00000000..866896ea --- /dev/null +++ b/codes/swift/chapter_computational_complexity/iteration.swift @@ -0,0 +1,75 @@ +/** + * File: iteration.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* for 循环 */ +func forLoop(n: Int) -> Int { + var res = 0 + // 循环求和 1, 2, ..., n-1, n + for i in 1 ... n { + res += i + } + return res +} + +/* while 循环 */ +func whileLoop(n: Int) -> Int { + var res = 0 + var i = 1 // 初始化条件变量 + // 循环求和 1, 2, ..., n-1, n + while i <= n { + res += i + i += 1 // 更新条件变量 + } + return res +} + +/* while 循环(两次更新) */ +func whileLoopII(n: Int) -> Int { + var res = 0 + var i = 1 // 初始化条件变量 + // 循环求和 1, 4, ... + while i <= n { + res += i + // 更新条件变量 + i += 1 + i *= 2 + } + return res +} + +/* 双层 for 循环 */ +func nestedForLoop(n: Int) -> String { + var res = "" + // 循环 i = 1, 2, ..., n-1, n + for i in 1 ... n { + // 循环 j = 1, 2, ..., n-1, n + for j in 1 ... n { + res.append("(\(i), \(j)), ") + } + } + return res +} + +@main +enum Iteration { + /* Driver Code */ + static func main() { + let n = 5 + var res = 0 + + res = forLoop(n: n) + print("\nfor 循环的求和结果 res = \(res)") + + res = whileLoop(n: n) + print("\nwhile 循环的求和结果 res = \(res)") + + res = whileLoopII(n: n) + print("\nwhile 循环(两次更新)求和结果 res = \(res)") + + let resStr = nestedForLoop(n: n) + print("\n双层 for 循环的遍历结果 \(resStr)") + } +} diff --git a/codes/swift/chapter_computational_complexity/recursion.swift b/codes/swift/chapter_computational_complexity/recursion.swift new file mode 100644 index 00000000..5b4012cc --- /dev/null +++ b/codes/swift/chapter_computational_complexity/recursion.swift @@ -0,0 +1,57 @@ +/** + * File: recursion.swift + * Created Time: 2023-09-02 + * Author: nuomi1 (nuomi1@qq.com) + */ + +/* 递归 */ +func recur(n: Int) -> Int { + // 终止条件 + if n == 1 { + return 1 + } + // 递:递归调用 + let res = recur(n: n - 1) + // 归:返回结果 + return n + res +} + +/* 尾递归 */ +func tailRecur(n: Int, res: Int) -> Int { + // 终止条件 + if n == 0 { + return res + } + // 尾递归调用 + return tailRecur(n: n - 1, res: res + n) +} + +/* 斐波那契数列:递归 */ +func fib(n: Int) -> Int { + // 终止条件 f(1) = 0, f(2) = 1 + if n == 1 || n == 2 { + return n - 1 + } + // 递归调用 f(n) = f(n-1) + f(n-2) + let res = fib(n: n - 1) + fib(n: n - 2) + // 返回结果 f(n) + return res +} + +@main +enum Recursion { + /* Driver Code */ + static func main() { + let n = 5 + var res = 0 + + res = recursion.recur(n: n) + print("\n递归函数的求和结果 res = \(res)") + + res = recursion.tailRecur(n: n, res: 0) + print("\n尾递归函数的求和结果 res = \(res)") + + res = recursion.fib(n: n) + print("\n斐波那契数列的第 \(n) 项为 \(res)") + } +}