r が 0 だとクラッシュしてしまいます。 func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ... n).reduce(into: 1) { $0 *= $1 } }..< の右の n + 1 が不格好なんですよね・・・。 func npr(_ n: Int, _ r: Int) -> Int { (n - r + 1 ..< n + 1).reduce(into: 1) { $0 *= $1 } }... 使うと実行時エラーを踏みまくるので、 ..< ばかり使うようにしています。