1- 问题描述
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
2- 思路分析
很自然的会想到递归,假设 n 级台阶有 T(n) 种不同走法。最后一步存在两种情况:剩下 1 级台阶,或者,剩下 2 级台阶。
第一种情形,则前面 n-1 步有 T(n-1)种走法;
第二种情形,则前面 n-2 步有 T(n-2)种走法。
故有:T(n) = T(n-1) + T(n-2),其中 T(1) = 1, T(2) = 2。正好是 Fibonacci 数列!
递归算法能缩短程序代码、提高编程效率,但是它也有致命的弱点:如果递归调用地层次过多甚至无休止的进行递归调用,将耗尽系统资源(栈满),出现“堆栈溢出错误”。所幸的是,一般可以用递归解决的问题也可以用循环解决!
3- Python实现
1 # -*- coding: utf-8 -*- 2 # Climbing Stairs 3 # 递归实现 4 5 def climbStairs(n): 6 if not n: return 0 7 solv = [] 8 solv.extend([1, 2]) # T(1), T(2) 9 if n >= 3: 10 for i in range(2, n): 11 solv.append(solv[i-1] + solv[i-2]) 12 return solv[n-1]
1 # -*- coding: utf-8 -*- 2 # Climbing Stairs 3 # 循环实现 4 5 def climbStairs(n): 6 if not n: return 0 7 if n == 1: return 1 8 if n == 2: return 2 9 10 a, b = 1, 2 11 for i in range(2, n): 12 a, b = b, a + b 13 return b