问题描述:
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
问题目前解法 其实 是斐波那契数列 ,因为一次只能走1步或2步,第n 阶楼梯,是从n-1或n-2那一阶梯上来的,方法数也
就是两者之和,通项 A(n)=A(n-1)+A(n-2)
但是
在下第一次见到这个题时能力太低,难免会对他的解法..... 没这么高端
1设上楼梯有 i 步是一次走了两个台阶,那么会有n-2i步是走了一阶,一共走了n-i步
2走n 阶楼梯最多会有 int(n/2)步是走了两阶的
*3当走了 i 步两个台阶,到达第n阶,的走法就刚好是 C(i,n-i)=A(i,n-i)/i!=(n-i)!/((n-2i)!*(i)!)
4所有方法数 就是从 i=1到 i=int(n/2)所有方法数之和
*3的证明:
走了 i 个两步, 那走到n 阶
一共走了n-i步,方法数为 n-i个不同元素的排列数除以i 个不同元素的排列数和n-2i个不同 元素的排列数之积,
及n-i的阶乘除
以
i的阶乘和n-2i的阶乘,A(n-i,n-i)/(A(n-2i,n-2i)*A(i,i)) 即为(n-i)!/((n-2i)!*(i)!)
刚好 为从 n-i个不同元素取i 个不同元素的组合数 C(i,n-i)
代码(python):
def climbStairs(self, n):
# write your code here
if n==0 :
return n
def C(n,m): #定义一个求组合数的函数
result = 1
n=n-m
for i in xrange(1,m+1):
result *=(n+i)/float(i)
return result
end=1
for i in xrange(1,int(n/2)+1):
end+=C(n-i,i) #求i=1到n-i的所有方法数
return int(end)