场景 :处理递归问题时(比如斐波那契数列、爬楼梯问题),如果发现存在重复计算的子问题(如 fib(5)
多次计算 fib(3)
),可以用 哈希表/数组 缓存结果,时间复杂度直接从指数级降到线性级!
以下是 斐波那契数列 的普通递归和记忆化递归的 Java 实现对比:
普通递归(低效,时间复杂度 O(2ⁿ))
java
public class Fibonacci {
// 普通递归
public static int fib(int n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
}
记忆化递归(高效,时间复杂度 O(n))
java
import java.util.HashMap;
import java.util.Map;
public class Fibonacci {
private static Map<Integer, Integer> memo = new HashMap<>();
// 记忆化递归
public static int fibMemo(int n) {
if (n <= 1) return n;
// 如果缓存中没有 n 的结果,则计算并存入缓存
if (!memo.containsKey(n)) {
memo.put(n, fibMemo(n - 1) + fibMemo(n - 2));
}
return memo.get(n);
}
}
对比测试
java
public static void main(String[] args) {
int n = 40; // 普通递归会卡住,记忆化递归秒出结果
System.out.println("记忆化递归结果: " + fibMemo(n));
// System.out.println("普通递归结果: " + fib(n)); // 慎用,n 太大会超时!
}
关键点:
- 静态哈希表
memo
:用于缓存已计算的斐波那契数。 - 避免重复计算:递归时优先从缓存读取结果,没有再计算。
- 性能对比 :
fibMemo(40)
几乎是瞬间完成,而fib(40)
需要指数级时间。
进阶优化(使用数组代替哈希表,更高效):
java
public class Fibonacci {
private static Integer[] memoArray;
// 记忆化递归(数组版)
public static int fibMemoArray(int n) {
memoArray = new Integer[n + 1];
return helper(n);
}
private static int helper(int n) {
if (n <= 1) return n;
if (memoArray[n] == null) {
memoArray[n] = helper(n - 1) + helper(n - 2);
}
return memoArray[n];
}
}
试试用记忆化优化你的递归代码,效率直接起飞! 🚀