[TypeScript] Type Challenges #4182 - Fibonacci Sequence

16 阅读1分钟

题目描述

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:更新为PrevCurrent的和,即[...Prev, ...Current]