思路: 2x+y=n,求 x,y 可能的种类
方法一:递归,爬到第 n 阶台阶的种类=爬到第 n-1 阶台阶的种类+爬到第 n-2 阶台阶的种类
超出时间限制
在递归解法中,例如计算斐波那契数列,每个数是前两个数的和。计算fib(5)会计算fib(4)和fib(3),而在计算fib(4)时又会计算fib(3)和fib(2)。这里fib(3)被重复计算,因为递归不会记住之前的结果。随着输入值的增大,重复计算的问题会变得更加严重,大大增加了计算量。
或许可以加上记录子问题答案的逻辑。。。
func climbStairs(n int) int {
if n < 0 {
return 0
//注意,爬到0阶台阶,种类是1,不是0
} else if n == 1 || n == 0 {
return 1
}
return climbStairs(n-1) + climbStairs(n-2)
}
方法二:自下往上推
先求爬到 1 阶的种类,再 2 阶的种类,再 3 阶的种类。。。再 n 阶的种类
这种解法叫动态规划
func climbStairs(n int) int {
//用一个切片记录爬到第几阶楼梯的种类
slice := make([]int, n+1, n+1)
slice[0], slice[1] = 1, 1
for i := 2; i <= n; i++ {
slice[i] = slice[i-1] + slice[i-2]
}
return slice[n]
}