1. 程式人生 > >面試題經典:跳臺階問題

面試題經典:跳臺階問題

題目:

給定一個有N個臺階的樓梯,一個人從下到上開始跳臺階,這個人有兩種跳的方式:一次跳一個臺階,一次跳兩個臺階;

問:從臺階底端跳到臺階頂端,有多少種跳臺階的方式?

分析:

首先我們考慮最簡單的情況。如果只有1個臺階,那麼顯然只有一種跳法;如果是2級臺階,那麼有2種跳法。對於一個有n級臺階的樓梯來說,我們設跳法為 f(n) ,假如我們先跳1個臺階,則剩下有 n-1 個臺階,跳法為 f(n-1) 次,假如我們先跳2個臺階,則剩下 n-2 階,跳法為 f(n-2);由此可以推出,對於一個n階的樓梯,有以下這個跳臺階的公式:


程式碼如下:

  1. #include <iostream>
  2. usingnamespace std;  
  3. int JumpStep(int n)  
  4. {  
  5.     if(n <= 0)  
  6.         return -1;  
  7.     if(n == 1)  
  8.         return 1;  
  9.     if(n == 2)  
  10.         return 2;  
  11.     return JumpStep(n-1)+JumpStep(n-2);  
  12. }  
  13. int main()  
  14. {  
  15.     cout<<"5 step jumps : "<<JumpStep(5)<<endl;  
  16.     return
     0;  
  17. }  

擴充套件:

當跳臺階的選擇多了呢?比如說 每次可以跳3個臺階;按照同樣的方法分析,如下公式:


解題程式碼如下:

  1. /** 
  2. 題目描述: 
  3. 有N個臺階,一個人從臺階下向上跳臺階,有兩種跳的選擇 
  4. 1次跳一個臺階,1次跳兩個臺階 這兩種選擇; 
  5. */
  6. #include <iostream>
  7. usingnamespace std;  
  8. int JumpStep(int n)  
  9. {  
  10.     if(n <= 0)  
  11.         return -1;  
  12.     if(n == 1)  
  13.         return 1;  
  14.     if(n == 2)  
  15.         return 2;  
  16.     return JumpStep(n-1)+JumpStep(n-2);  
  17. }  
  18. int JumpStep3(int n)  
  19. {  
  20.     if(n <= 0)  
  21.         return -1;  
  22.     if(n == 1)  
  23.         return 1;  
  24.     if(n == 2)  
  25.         return 2;  
  26.     if(n == 3)  
  27.         return 4;  
  28.     return JumpStep3(n-1)+JumpStep3(n-2)+JumpStep3(n-3);  
  29. }  
  30. int main()  
  31. {  
  32.     cout<<"5 step jumps : "<<JumpStep(5)<<endl;  
  33.     cout<<"5 step jumps : "<<JumpStep3(5)<<endl;  
  34.     return 0;  
  35. }