1. 程式人生 > >MOOC清華《程式設計基礎》第6章第1題:n級臺階問題(遞推法)

MOOC清華《程式設計基礎》第6章第1題:n級臺階問題(遞推法)

題目描述

下n級臺階,每步可下1級或2級臺階。那麼從n級臺階下到地面,共有多少種不同的下臺階方案?

輸入:n

輸出:方案數

輸入格式

多行輸入,每一行輸入一個正整數n,表示n級臺階

輸出格式

每一行輸出n級臺階的方案數

樣例輸入
1
2
樣例輸出
1
2

DevCpp可以編譯通過,而學堂線上OJ系統不通過的程式碼:

#include <iostream>
using namespace std;

int N = 10;  //臺階數,方便可調 

int main()
{
	int n[N] = {0};
	int i = 0;
	while(cin>>n[i])  //輸入臺階數 
		i++;
	int scheme_1 = 1, scheme_2 = 2;  //給最簡單的兩種方案賦初值
	int scheme[N] = {0};
	int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0;  //不用陣列遞推,節約記憶體空間 
	for(int j = 0; j < i; j++)
	{
		qian_xiang = scheme_1;
		shang_xiang = scheme_2;
		if(n[j] >= 3)
		{
			for(int k = 3; k <= n[j]; k++) 
			{
				ben_xiang = shang_xiang + qian_xiang;
				qian_xiang = shang_xiang;
				shang_xiang = ben_xiang;   //遞推公式,這個規律在草稿紙上推得 
			}
			scheme[j] = ben_xiang;
		}
		if(n[j] == 1) scheme[j] = scheme_1;
		if(n[j] == 2) scheme[j] = scheme_2;   //尤其要注意迴圈變數和陣列下標 
	}
	for(int j = 0; j < i; j++)
		cout << scheme[j] << endl;
	return 0;
}

錯誤提示如下:
Main.cpp: In function 'int main()':
Main.cpp:9:15: error: variable-sized object 'n' may not be initialized
int n[N] = {0};
^
Main.cpp:14:20: error: variable-sized object 'scheme' may not be initialized
int scheme[N] = {0};
^

經查,這是因為OJ編譯器版本比較老舊造成的,定義陣列大小時必須使用常量,不能用變數。

測試結果:


令我驚奇地發現:這個問題背後的數學規律,居然也是斐波那契數列!要是把題目改成或一次走1級、或一次走2級、或一次走3級,那就不能用斐波那契數列來遞推了。

把定義陣列長度時的變數N改為常量20以後,程式碼就能順利通過OJ測試了!程式碼如下:

#include <iostream>  
using namespace std;   
  
int main()  
{  
    int n[20] = {0};  
    int i = 0;  
    while(cin>>n[i])  //輸入臺階數   
        i++;  
    int scheme_1 = 1, scheme_2 = 2;  //給最簡單的兩種方案賦初值  
    int scheme[20] = {0};  
    int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0;  //不用陣列遞推,節約記憶體空間   
    for(int j = 0; j < i; j++)  
    {  
        qian_xiang = scheme_1;  
        shang_xiang = scheme_2;  
        if(n[j] >= 3)  
        {  
            for(int k = 3; k <= n[j]; k++)   
            {  
                ben_xiang = shang_xiang + qian_xiang;  
                qian_xiang = shang_xiang;  
                shang_xiang = ben_xiang;   //遞推公式,這個規律在草稿紙上推得   
            }  
            scheme[j] = ben_xiang;  
        }  
        if(n[j] == 1) scheme[j] = scheme_1;  
        if(n[j] == 2) scheme[j] = scheme_2;   //尤其要注意迴圈變數和陣列下標   
    }  
    for(int j = 0; j < i; j++)  
        cout << scheme[j] << endl;  
    return 0;  
}