PHP 爬楼梯(递归相关)- LeetCode 70

535 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

今天说一个爬楼梯的问题。

image.png

实现思路

由于题目固定为每次只可以走 1 或 2 个台阶,假设我们走在了第 n 级台阶上,那么我们就是由 n-1 或 n-2 级台阶上来的。

假设我们走到 n-1 级台阶上,有 a 种走法;走到 n-2 级台阶上,有 b 种走法。

而第 n 级台阶是由 n-1 或 n-2 级台阶上来的,所以第 n 级台阶就由 n-1 级台阶的走法加上 n-2 级台阶的走法,即 a+b。

image.png

假设 f(n) 表示走n级台阶的走法,那么 f(n) = f(n-1) + f(n-2)。

所以我们想知道某一级台阶有多少种走法时,就需要知道这一级台阶的前一级和前两级台阶的走法数。

不知道大家有没有这样的疑惑,那就是如果 f(n) = f(n-1) + f(n-2),那么实现n级台阶的走法,因为 n-1 级台阶还需要 1 级台阶走到 n 级,n-2 级台阶还需要 2 级台阶走到 n 级。这前两级台阶还需要走的级数还算不算一种走法呢?

答案是不需要计算,因为当我们得知 n-1 和 n-2 级台阶的走法数时,根据它们之前的走法,n-1 级台阶只能再走 1 级,n-2 级台阶只能再走 2 级,所以在走向 n 级台阶时,它们的走法已经被之前的过程限制了。

完整代码-递归实现

image.png

第401-406行代码,由于第1级、第2级台阶不符合刚才的规则,所以这两个是边界条件,n=1 时,只有1种走法;n=2 时,只有两种走法。

第408行代码,由于 f(n) = f(n-1) + f(n-2),所以需要不断的往下递归,直到剩余1级台阶或者2级台阶。

如果n的数值比较小,还可以运行,如果比较大的话,就会运行超时。

因为在不断的递归过程中,有需要重复的计算。

image.png

如上图中,n=6,在不断往下级台阶计算时,重复计算了第3级和第4级台阶,所以我们需要优化下代码,把计算过的台阶存储起来,如果再次需要的话,直接取数据就可以,不需要再计算了。

递归优化代码

我们把每一级台阶所需的走法存入数组内,等待再次需要,这样就避免了大量重复计算。

image.png