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
總結
以上是生活随笔為你收集整理的python爬楼梯问题_爬楼梯算法的数学思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中文分词技术--统计分词
- 下一篇: python实现获取ip、网站备案信息、