91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python算法如何解決樓梯臺階問題

發布時間:2021-09-10 10:10:20 來源:億速云 閱讀:150 作者:chen 欄目:編程語言

這篇文章主要講解了“Python算法如何解決樓梯臺階問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python算法如何解決樓梯臺階問題”吧!

有一個有N個臺階的樓梯,你一次可以爬1或2個臺階。

給定N,編寫一個函數,返回爬完樓梯的方式數量。步驟的順序很重要。

例如,如果N是4,那么有5種方式:

1,1,1,1

2,1,1

1,2,1

1,1,2

2,2

如果規定的不是一次只能爬1或2步,而是可以使用正整數X集合內的任意數字爬樓梯,那會怎么樣?例如,如果X = {1,3,5},則表示一次爬升1,3或5階樓梯。

Python算法如何解決樓梯臺階問題

解決方案

從一些測試案例開始總是好的做法。讓我們從小的案例開始,看看能否找到某種規律。

  • N = 1,1種爬樓方式:[1]

  • N = 2,2種爬樓方式:[1,1],[2]

  • N = 3,3種爬樓方式:[1,2],[1,1,1],[2,1]

  • N = 4,5種爬樓方式:[1,1,2],[2,2],[1,2,1],[1,1,1,1],[2,1,1]

你有沒有注意到什么?請看N = 3時,爬完3階樓梯的方法數量是3,基于N = 1和N = 2。存在什么關系?

爬完N = 3的兩種方法是首先達到N = 1,然后再往上爬2步,或達到N = 2再向上爬1步。所以 f(3) = f(2) + f(1)。

這對N = 4是否成立呢?是的,這也是成立的。因為我們只能在達到第三個臺階然后再爬一步,或者在到了第二個臺階之后再爬兩步這兩種方式爬完4個臺階。所以f(4) = f(3) + f(2)。

所以關系如下: f(n) = f(n – 1) + f(n – 2),且f(1) = 1和f(2) = 2。這就是斐波那契數列。

def fibonacci(n):
 if n <= 1:
 return 1
 return fibonacci(n - 1) + fibonacci(n - 2)

當然,這很慢(O(2^N))——我們要做很多重復的計算!通過迭代計算,我們可以更快:

def fibonacci(n):
 a, b = 1, 2
 for _ in range(n - 1):
 a, b = b, a + b
 return a

現在,讓我們嘗試概括我們學到的東西,看看是否可以應用到從集合X中取步數這個要求下的爬樓梯。類似的推理告訴我們,如果X = {1,3,5},那么我們的算法應該是f(n) = f(n – 1) + f(n – 3) + f(n – 5)。如果n <0,那么我們應該返回0,因為我們不能爬負數。

def staircase(n, X):
 if n < 0:
 return 0
 elif n == 0:
 return 1
 elif n in X:
 return 1 + sum(staircase(n - x, X) for x in X if x < n)
 else:
 return sum(staircase(n - x, X) for x in X if x < n)

這也很慢(O(|X|^N)),因為也重復計算了。我們可以使用動態編程來加快速度。

每次的輸入cache[i]將包含我們可以用集合X到達臺階i的方法的數量。然后,我們將使用與之前相同的遞歸從零開始構建數組:

def staircase(n, X):
 cache = [0 for _ in range(n + 1)]
 cache[0] = 1
 for i in range(n + 1):
 cache[i] += sum(cache[i - x] for x in X if i - x > 0)
 cache[i] += 1 if i in X else 0
 return cache[-1]

現在時間復雜度為O(N * |X|),空間復雜度為O(N)。

感謝各位的閱讀,以上就是“Python算法如何解決樓梯臺階問題”的內容了,經過本文的學習后,相信大家對Python算法如何解決樓梯臺階問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯门区| 新津县| 金乡县| 师宗县| 元氏县| 永兴县| 中山市| 绩溪县| 巩留县| 平果县| 综艺| 和平县| 大港区| 安岳县| 鹤壁市| 平遥县| 临沂市| 彭山县| 永靖县| 通榆县| 建平县| 望奎县| 东乡县| 弥勒县| 林周县| 凤冈县| 菏泽市| 茶陵县| 怀化市| 云梦县| 敖汉旗| 体育| 广南县| 大冶市| 郎溪县| 定兴县| 博客| 宁远县| 崇明县| 石泉县| 繁昌县|