有n階樓梯,有1,2,3;走m步走完樓梯,一共有多少種走法,並輸出所有的走法;
設走n階台階的走法數為:f(n)
可以得到:f(1) = 1 f(2) = 2 f(3) = 4
對於n>3時,縮小問題規模:
最後一步上乙個台階的話,之前上了n-1個台階,走法為f(n-1);
最後一步上兩個台階的話,之前上了n-2個台階,走法為f(n-2);
最後一步上三個台階的話,之前上了n-3個台階,走法為f(n-3);
可以推得遞迴公式:
f(n) = f(n-1) + f(n-2) + f(n-3);
//傳入的n為n階樓梯
intrecursive
(int n)
以上**只能得到多少種走法,由於要滿足m步,此時可以優化
可以考慮:
一共n階,設走1階樓梯 i 步;2階樓梯 j 步;3階樓梯 k 步;
則:i+j+k =m ; i * 1 + 2 * j + 3 * k = n
直接使用巢狀for迴圈,輪詢所有的可能性
//宣告乙個全域性變數,二維陣列
int dp[
101]
[101]=
;//x為n階段樓梯的走法,y為要求的m步
void
recursive
(int x,
int m)
cout<<
"一共有"
<[n]<<
"種走法"
<}
宣告了乙個二維陣列,把遞迴的值放入其中,這樣的到的值就被儲存下來了,取最後的那個值,就是所有的走法的總數
由於要輸出所有的走法的具體情況
上述的**無法實現,繼續優化
需要的函式是乙個能記錄已經走了多少步的,並且能輸出當前情況的,能記錄還有多少階台階沒有走的遞迴函式;
int count;
//定義乙個全域性變數計數器
//傳入的值steped為已經走的步數,ans為最後輸出的字串答案,left為剩餘的台階數
void
func
(int steped,string ans,
int left)
//如果走了不止m步或者走過頭(台階剩餘為負)
if(steped > m || left <0)
//向三種情況遞迴搜尋,ans新增當前這一步的級數
func
(steped +
1, ans +
"1-"
, left -1)
;func
(steped +
1, ans +
"2-"
, left -2)
;func
(steped +
1, ans +
"3-"
, left -3)
;}
這樣的情況下,就可以輸出得到所有的情況了,只需要在主函式中輸出全域性變數count就可以得到所有走法的可能性了
int
main()
#include
#include
using
namespace std;
void
func
(int steped, string ans,
int left)
;int n, m;
//n為階數,m為步數
int num;
//計數器
intmain()
//傳入的值steped為已經走的步數,ans為最後輸出的字串答案,left為剩餘的台階數
void
func
(int steped, string ans,
int left)
//如果走了不止m步或者走過頭(台階剩餘為負)
if(steped > m || left <0)
//向三種情況遞迴搜尋,ans新增當前這一步的級數
func
(steped +
1, ans +
"1-"
, left -1)
;func
(steped +
1, ans +
"2-"
, left -2)
;func
(steped +
1, ans +
"3-"
, left -3)
;}
不好插入,就不插入了,自己嘗試吧
語雀原版文件
我使用的環境是vs2019
python爬樓梯演算法 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
演算法之爬樓梯
題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?沙雕解法一 利用遞迴,就是最後一步一定是前一步走一步或倒退兩步走兩步,超時!include pch.h include include using namespace std i...
演算法題 爬樓梯
題幹 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 核心思想 這題明顯是一道遞迴題,通用公式是climbstairs n climbstairs n 1 climbstairs n 2 但是直接...