Hone logo
Hone
Problems

Type-Level Dynamic Programming: Fibonacci Sequence

This challenge involves implementing the Fibonacci sequence calculation at the TypeScript type level. Dynamic programming is a powerful technique for solving problems by breaking them down into smaller overlapping subproblems and storing the results of these subproblems to avoid redundant calculations. We will apply this concept to TypeScript's type system.

Problem Description

Your task is to create a TypeScript type, Fibonacci<N>, that calculates the Nth Fibonacci number at compile time. The Fibonacci sequence is defined as follows:

  • F(0) = 0
  • F(1) = 1
  • F(n) = F(n-1) + F(n-2) for n > 1

You need to implement this logic using TypeScript's conditional types, recursive types, and potentially type unions/intersections. The resulting type should resolve to a number representing the Nth Fibonacci number.

Key Requirements:

  1. Type-Level Calculation: The calculation must happen entirely within the TypeScript type system. No runtime JavaScript code should be involved in the Fibonacci computation itself.
  2. Recursive Definition: Model the recursive definition of the Fibonacci sequence using type recursion.
  3. Base Cases: Handle the base cases F(0) and F(1) correctly.
  4. Number Literal Types: Your type should accept N as a number literal type (e.g., 5, 10).
  5. Result Type: The Fibonacci<N> type should resolve to a number literal type.

Expected Behavior:

  • Fibonacci<0> should resolve to 0.
  • Fibonacci<1> should resolve to 1.
  • Fibonacci<5> should resolve to 5 (0, 1, 1, 2, 3, 5).
  • Fibonacci<10> should resolve to 55.

Edge Cases:

  • Consider the input 0.
  • Consider the input 1.
  • The problem statement implies non-negative integers. Assume N will always be a non-negative number literal.

Examples

Example 1:

// Input: 0
type Result0 = Fibonacci<0>;
// Expected Output: 0

Explanation: The 0th Fibonacci number is defined as 0.

Example 2:

// Input: 1
type Result1 = Fibonacci<1>;
// Expected Output: 1

Explanation: The 1st Fibonacci number is defined as 1.

Example 3:

// Input: 5
type Result5 = Fibonacci<5>;
// Expected Output: 5

Explanation: F(0)=0, F(1)=1, F(2)=F(1)+F(0)=1, F(3)=F(2)+F(1)=2, F(4)=F(3)+F(2)=3, F(5)=F(4)+F(3)=5.

Example 4:

// Input: 10
type Result10 = Fibonacci<10>;
// Expected Output: 55

Explanation: Continuing the sequence, F(6)=8, F(7)=13, F(8)=21, F(9)=34, F(10)=55.

Constraints

  • The input N will be a non-negative number literal type.
  • The maximum value of N for which your solution should be practically resolvable by TypeScript's compiler might be limited by compiler performance. Aim for a solution that works for N up to at least 20. Very large numbers might exceed compiler limits or lead to excessively long compile times.

Notes

This challenge is about understanding and leveraging TypeScript's advanced type manipulation features. Think about how you can represent the recursive relationship and the base cases using conditional types. You might find it useful to define helper types or use tuple manipulation if you can't directly operate on numbers. However, the most direct approach often involves recursive conditional types.

Loading editor...
typescript