我最近正在研究CTCI,并对第9.1项问题的解决方案有一些疑问。我认为解决方案可能是错误的。
问题是
一个孩子在n级台阶上跑步,可以一步跳一步,两步或三步。实施一种方法来计算孩子爬楼梯的可能方式。
给出的解决方案是here:
public class Question {
public static int countWaysDP(int n, int[] map) {
if (n < 0) {
return 0;
} else if (n == 0) {
return 1;
} else if (map[n] > -1) {
return map[n];
} else {
map[n] = countWaysDP(n - 1, map) +
countWaysDP(n - 2, map) +
countWaysDP(n - 3, map);
return map[n];
}
}
public static int countWaysRecursive(int n) {
if (n < 0) {
return 0;
} else if (n == 0) {
return 1;
} else {
return countWaysRecursive(n - 1) + countWaysRecursive(n - 2) + countWaysRecursive(n - 3);
}
}
public static void main(String[] args) {
for (int i = 0; i < 30; i++) {
long t1 = System.currentTimeMillis();
int[] map = new int[30 + 1];
for (int j = 0; j < map.length; j++) {
map[j] = -1;
}
int c1 = countWaysDP(i, map);
long t2 = System.currentTimeMillis();
long d1 = t2 - t1;
long t3 = System.currentTimeMillis();
int c2 = countWaysRecursive(i);
long t4 = System.currentTimeMillis();
long d2 = t4 - t3;
System.out.println(i + " " + c1 + " " + c2 + " " + d1 + " " + d2);
}
}
}
在上面的解决方案中,当countWaysDP(int n, int[] map)
给定整数1时,它将返回-1,而不是返回1。因为程序将转到分支(map[n] > -1)
,它将返回map[n]
,map[1]
,-1
,因为它已初始化。