Typescript类型体操 - FibonacciSequence

题目

中文

实现一个输入参数为数字 T 的泛型类型 Fibonacci<T>, 返回 T 对应的斐波那契数

斐波那契数列:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

示例:

type Result1 = Fibonacci<3>; // 2
type Result2 = Fibonacci<8>; // 21

English

Implement a generic Fibonacci<T> that takes a number T and returns its 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

答案

type Fibonacci<
    T extends number,
    ACC extends [any[], any[], any[]] = [[any], [any], [any, any]]
> = T extends 1 | 2
    ? 1
    : ACC[2]['length'] extends T
    ? ACC[0]['length']
    : Fibonacci<T, [[...ACC[0], ...ACC[1]], [...ACC[0]], [any, ...ACC[2]]]>;

在线演示

第二个泛型参数ACC的说明

第二个泛型参数ACC是一个元组; 元组中第一个元素是一个any[]类型的数组, 数组的长度表示 \(F_n\) ; 第二个元素代表也是一个any[]类型的数组, 数组的长度表示 \(F_{n-1}\) ; 第三个元素还是一个any[]类型是数组, 数组长度表示迭代次数

posted @ 2022-10-02 16:30  Laggage  阅读(38)  评论(0编辑  收藏  举报