题目描述
Implement a generic Fibonacci takes an number T and returns it's corresponding Fibonacci number.
The sequence starts: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
For example
type Result1 = Fibonacci<3> // 2
type Result2 = Fibonacci<8> // 21
题解
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<Fibonacci<1>, 1>>,
Expect<Equal<Fibonacci<2>, 1>>,
Expect<Equal<Fibonacci<3>, 2>>,
Expect<Equal<Fibonacci<8>, 21>>,
]
// ============= Your Code Here =============
// ============= Your Code Here =============
type Fibonacci<
T extends number,
CurrentIndex extends any[] = [unknown],
Prev extends any[] = [],
Current extends any[] = [unknown]
> =
CurrentIndex['length'] extends T
? Current['length']
: Fibonacci<
T,
[...CurrentIndex, unknown],
Current,
[...Prev, ...Current]
>
泛型参数
-
T extends number:确保T是一个数值类型 -
CurrentIndex extends any[] = [unknown]:表示当前索引,初始值为[unknown],长度为1,表示从第1个斐波那契数开始 -
Prev extends any[] = []:表示前一个斐波那契数,初始值为空数组,长度为0 -
Current extends any[] = [unknown]:表示当前的斐波那契数,初始值为[unknown],长度为1,表示初始值为1
递归逻辑
-
当
CurrentIndex['length']等于T时,返回Current['length'],即当前索引对应的斐波那契数 -
否则,递归调用
Fibonacci,更新参数:-
CurrentIndex:在当前索引后追加一个unknown,表示索引加1 -
Prev:更新为当前的斐波那契数Current -
Current:更新为Prev和Current的和,即[...Prev, ...Current]
-