python爬楼梯问题_爬楼梯算法的数学思路

爬楼梯算法的数学思路

今日腾讯实习面试,问到一题算法。

爬楼梯问题:一个楼梯一共n个台阶,一次上1或者2个台阶。问,一共多少种解法。

这个问题,当时学递归的时候,我记得做过。但是已经一年半没写过递归和动态规划。所以,第一反应是用数学思路解决。

数学的想法是这样的:

n已知

我们创建一个列表存放执行的步骤:

比如,有三个台阶。

**[1,1,1]**代表,我们每次走一个台阶,完成这个任务。

**[1,2]**代表,先走1个台阶,再走2个台阶。完成任务。

**[2,1]**代表,先走2个台阶,再走1个台阶。完成任务。

当已知的台阶数为n, 自然就有下面的想法。

[ n个1 ] 意为走了n个1完成任务

[ n-1 个 1; 1 个 2 ] 意为走了n-1个1, 走了一个2完成任务。

[ n-2 个 1; 2 个 2 ] 意为走了n-2个1, 走了两个2完成任务。

一个重要的点是:

当我们采用走了n-1个1,和一个2时,它的方法总数其实应该是:

意为: 将1个2放到n-1个1中。

所以最后的结果应该为:

所有的和为:

sum = 1 + Cnk(n-1, 1) + Cnk(n-2, 2) + … Cnk(n/2 , n/2) 偶数情况。

sum = 1 + Cnk(n-1, 1) + Cnk(n-2, 2) + … Cnk(n//2 + 1 , n//2 - 1) 奇数情况。

注: n//2 为: 用n整除2, 然后取得的数向下取整。 (2.1取2, 2.9取2)

代码如下:

def computer(n):

all_ways = 1

if n % 2 == 0:

stop_num = int(n / 2)

for i in range(1, stop_num + 1):

all_ways += Cnk(n - i, i)

if n % 2 == 1:

stop_num = (n // 2) + 1

for i in range(1, stop_num + 1):

all_ways += Cnk(n - i, i)

return all_ways

def Cnk(n, k):

value1 = 1

for i in range(k):

value1 = value1 * (n - i)

value2 = 1

for i in range(1, k + 1):

value2 = value2 * i

ans = value1 / value2

return ans

def main():

n = 6

ways = computer(n)

print(ways)

main()

因为当时只给了15min写代码,所以没有写出来。是我比较菜。这是我面试完之后花了30min左右补全的结果。

纪念人生第一次面试就凉凉的腾讯面试。

原文链接:https://blog.csdn.net/shangjun2018/article/details/105103994

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值