Fibonacci Number (Recursion & Backtracking)
Fibonacci Number is a easy recursion & backtracking problem solved with the basic recursion pattern.
The best approach, optimal (memoised recursion), runs in O(n) time and O(n) space.
Below are 2 approaches in Java, from plain recursion up.
Problem
The Fibonacci sequence starts F(0) = 0, F(1) = 1, and every later term is the sum of the previous two. Given n, return F(n).
In this module, focus on the recursion tree: why the plain version is exponential and how memoisation fixes it.
Examples
Example 1
- Input
n = 6- Output
8- Why
- 0, 1, 1, 2, 3, 5, 8.
Example 2
- Input
n = 1- Output
1
Constraints
0 <= n <= 30
Animated walkthrough
A narrated, step-by-step animation that builds the solution from the idea up. Press play, or step through it at your own pace.
Concepts first, then the problem and every approach, step by step.
Space to play or pause · ← → to jump a step · click or drag the bar to seek
Solutions
Try it yourself first. Then compare: each approach lists its idea, the steps, its time and space, and the Java code.
| Approach | Time | Space |
|---|---|---|
| Plain recursion | O(2ⁿ) | O(n) |
| Optimal (memoised recursion) | O(n) | O(n) |
1Plain recursion
O(2ⁿ)The call tree roughly doubles at each level.O(n)Maximum recursion depth is n.Translate the definition directly: fib(n) = fib(n - 1) + fib(n - 2). Correct, but the call tree branches twice at every level and recomputes the same values.
- if n < 2 return n.
- return fib(n - 1) + fib(n - 2).
class Solution {
public int fib(int n) {
if (n < 2) return n;
return fib(n - 1) + fib(n - 2);
}
}2Optimal (memoised recursion)
O(n)O(n)Cache each fib(i) the first time it is computed. Every value is then computed once, which turns the exponential tree into a straight line. This is the bridge from recursion to dynamic programming.
- memo array filled with -1.
- If memo[n] is set, return it; otherwise compute, store and return.
class Solution {
private int[] memo;
public int fib(int n) {
memo = new int[n + 1];
Arrays.fill(memo, -1);
return go(n);
}
private int go(int n) {
if (n < 2) return n;
if (memo[n] != -1) return memo[n];
return memo[n] = go(n - 1) + go(n - 2);
}
}Edge cases to test
- n = 0 and n = 1 (both base cases)
Hints
Hint 1
Draw the call tree for fib(5). How many times is fib(2) computed?
FAQ
What is the best time complexity for Fibonacci Number?
Optimal (memoised recursion) runs in O(n) time and O(n) extra space.
Which pattern does Fibonacci Number use?
It is a recursion & backtracking problem that uses the basic recursion pattern. Other problems with the same pattern: Factorial of a number, Binary Tree Inorder Traversal (Recursive), Basic Backtracking Template.
Is there a brute force solution for Fibonacci Number?
Yes. Plain recursion takes O(2ⁿ) time and O(n) space. Translate the definition directly: fib(n) = fib(n - 1) + fib(n - 2).
Which edge cases should I test for Fibonacci Number?
n = 0 and n = 1 (both base cases).