递归优化
问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?
标准代码
public static int f(int n) { if (n <= 2) { return n; }else{ return f(n - 1) + f(n - 2); } }
重复计算太多
优化代码
int[] arr = new int[1000]; public int f(int n) { if (n <= 2) { return n; } else { if (arr[n] != 0) { return arr[n];//已经计算过,直接返回 } else { arr[n] = f(n-1) + f(n-2); return arr[n]; } } }
对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。
不过,有时候当n比较大的时候,例如当n = 10000时,那么必须要往下递归10000层直到n <=2才将结果慢慢返回,如果n太大的话,可能栈空间会不够用。
对于这种情况,其实我们是可以考虑自底向上的做法的。例如我知道:
-
f(1)=1;
-
f(2)=2。
那么我们就可以推出f(3)= f(2)+f(1)=3。从而可以推出f(4),f(5)等直到f(n)。
因此,我们可以考虑使用自底向上的方法来做。
public static int f2(int n) { if (n <= 2) { return n; } int f1 = 1; int f2 = 2; int sum = 0; for (int i = 0; i <= n; i++) { sum = f1 + f2; f1 = f2; f2 = sum; } return sum; }
浙公网安备 33010602011771号