# 27152-三角形数
# 题目描述
给定一个数字 N,返回第 N 个三角形数 1 + 2 + 3 + ... + N。
type R1 = Triangular<1>; // 1
type R2 = Triangular<2>; // 3
type R3 = Triangular<3>; // 6
type R4 = Triangular<5>; // 15
# 分析
就是把 1..N 累加。类型层做加法参见 加减乘除 —— 用元组长度累计。
两种写法:
- 递归累加:从 1 到 N 逐步累加到一个结果元组里。
- 数学公式:
N * (N + 1) / 2,但类型层做乘除更贵。
递归累加更直接。
# 题解
type BuildTuple<N, R extends any[] = []> = R['length'] extends N
? R
: BuildTuple<N, [...R, any]>;
type Triangular<
N extends number,
Cur extends any[] = [],
Acc extends any[] = [],
> = Cur['length'] extends N
? [...Acc, ...BuildTuple<N>]['length']
: Triangular<N, [...Cur, any], [...Acc, ...BuildTuple<Cur['length']>]>;
思路:
Cur当作计数器(从 0 开始),每轮 +1。Acc累加到当前为止的"前 k 项和"。- 出口:
Cur长度 =N时,再加上一份BuildTuple<N>(即 N 本身),返回长度。
等价于把 0 + 1 + 2 + ... + (N-1) + N 的累加过程展开到类型层。
# 验证
type R0 = Triangular<0>; // 0
type R1 = Triangular<1>; // 1
type R2 = Triangular<2>; // 3
type R3 = Triangular<3>; // 6
type R4 = Triangular<5>; // 15
type R5 = Triangular<10>; // 55
# 知识点
- "当前计数 + 累加器"两个元组协同,是所有"求和 / 求积到 N"类型题的通用套路。
- 类型层加法本质是元组拼接,见 加减乘除。