假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
题目不难,这里我主要想写一下递归思想
递归篇
要想用递归,必须满足三个条件:
- 一个问题的解可以分为几个子问题的解;
- 这个问题和分解后的子问题,除了数据规模不同,求解思路完全一样;
- 存在递归终止条件。
再来看看上面的爬楼梯问题:想求n阶楼梯的不同爬法。假设你已经知道了1至(n-1)阶楼梯的解。
来分解子问题吖:
①第一步走了一个台阶——剩下n-1个台阶的爬法,你已经知道为f(n-1);
②第一步走了两个台阶——剩下n-2个台阶的爬法,你已经知道为f(n-2)。
子问题也就这两种情况叭~,递归关系这不就出来了嘛:f(n)=f(n-1)+f(n-1)。
终止条件题目已经给出:f(1)=1,f(2)=2。
好了,根据递归终止条件,你就可以解决刚刚提出的那个假设问题,计算出f(1)…f(n)。
递归代码如下:
public int climbStairs(int n) {
if(n==1)
return 1;
if(n==2)
return 2;
//n阶楼梯爬法拆解:第一步走了1阶+f(n-1) 第一步走了2阶+f(n-2)