爬楼梯,一次性可以爬一阶或两阶,问爬n阶有多少种方法
-
递归
from functools import lru_cache from fastcache import clru_cache @lru_cache(32) def climb_stairs(n: int) -> int: fmt = "需要输入正数,然而你输入的是{}" assert isinstance(n, int) and n > 0, fmt.format(n) if n == 1: return 1 if n == 2: return 2 return climb_stairs_dp(n-1)+climb_stairs_dp(n-2)
-
动态规划
定义:dp[i]表示上第i个阶梯的方法
边界条件:dp[1] = 1, dp[2] = 2
状态转移方程:dp[i] = dp[i-1]+dp[i-2]
def climb_stairs_dp(n: int) -> int: fmt = "需要输入正数,然而你输入的是{}" assert isinstance(n, int) and n > 0, fmt.format(n) if n == 1: return 1 dp = [0] * (n + 1) dp[0], dp[1] = (1, 1) for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n]
-
改进
def climb_stairs_dp_g(n: int) -> int: fmt = "需要输入正数,然而你输入的是{}" assert isinstance(n, int) and n > 0, fmt.format(n) if n == 1: return 1 if n == 2: return 2 a = 1 b = 2 c = 0 for i in range(3, n + 1): c = a + b a = b b = c return c
这个题会了,就能做Fibonacci(斐波拉契数)问题了
Fibonacci数列:1 1 2 3 5 8 13 …
f(n) = f(n-1) + f(n-2)