3-6.【函数式编程】设计一个函数,接受数组 [Int],返回每个元素的阶乘数组,要求使用函数式风格。

3 阅读1分钟

1️⃣ 定义阶乘函数

阶乘可以用递归或 reduce 实现:

func factorial(_ n: Int) -> Int {
    guard n > 1 else { return 1 }
    return (1...n).reduce(1, *) // 1*2*3*...*n
}
  • reduce(1, *) 会把序列 1...n 的元素相乘
  • 避免了显式循环,更函数式

2️⃣ 定义主函数

使用 map 将输入数组中的每个元素映射为它的阶乘:

func factorialArray(of numbers: [Int]) -> [Int] {
    return numbers.map { factorial($0) }
}

3️⃣ 测试

let nums = [1, 2, 3, 4, 5]
let result = factorialArray(of: nums)
print(result) // [1, 2, 6, 24, 120]
  • [1!, 2!, 3!, 4!, 5!] 对应 [1, 2, 6, 24, 120]

4️⃣ 完整函数式写法(不用额外函数)

如果你想更纯粹的函数式风格,也可以直接在 map 内用 reduce

let nums = [1, 2, 3, 4, 5]
let factorials = nums.map { n in (1...max(n, 1)).reduce(1, *) }
print(factorials) // [1, 2, 6, 24, 120]
  • 这里直接把阶乘逻辑写在闭包中
  • 避免了单独函数定义
  • max(n, 1) 保证 0 也返回 1