solve函式程式詳解 NOIP2004 提高組

2021-08-28 08:14:50 字數 2467 閱讀 6072

此題為筆試題的讀程式題。

題目程式**如下:

#includeusing namespace std;

int number,ndata,data[100],sum;

void solve(int s,int sign,int n){

int i;

for(i=s;i>number>>ndata;

sum=0;

for(i=0;i>data[i];

solve(0,1,1);

cout《輸入:1000 3 5 13 11

輸出:分析:此題是典型的for迴圈內插入遞迴呼叫,其實也可以轉換成迴圈巢狀。在求解此題之前可以先縮小一下規模,尋找程式執行的方式。只要找到這個子問題的方式,那麼這個題也就引刃而解了。

我們不如先把規模縮小。

​#includeusing namespace std;

int number,ndata,data[100],sum;

void solve(int s,int sign,int n){

int i;

for(i=s;i>number>>ndata;

sum=0;

for(i=0;i>data[i];

solve(0,1,1);

cout《執行此程式的結果為:

1000 3 5 13 11

1.1000

1.800

1.815

2.815

2.815

1.615

2.615

2.615

1.1615

1.1539

2.1539

2.1539

1.2539

2.2539

2539

那麼現在開始模擬這個程式的執行過程:

首先,s,sign和n的值從主函式中傳到子函式solve中的初值為0,1,1。

那麼第一次執行的值為:

solve(0,1,1);

for(i=0;i<3;i++)

sum=0+1*(1000/1)=1000;

然後呼叫函式,由遞迴式solve(i+1,-sign,n*data[i])知,此時變為solve(1,-1,1*data[0])=solve(1,-1,1*5)=solve(1,-1,5);

那麼第二次執行的值為:

solve(1,-1,5);

for(i=1;i<3;i++)

sum=1000-1*(1000/5)=800;

繼續呼叫函式,此時變為solve(2,1,5*data[1])=solve(2,1,5*13)=solve(2,1,65);

那麼第三次執行的值為:

solve(2,1,65);

for(i=2;i<3;i++)

sum=800+1*(1000/65)=815;

繼續呼叫函式,此時變為solve(3,-1,65);

但是,此時i=3,不符合迴圈條件,所以遞迴結束。開始返回。

返回:(p.s:學過的遞迴的oler應該都知道,遞迴是通過棧來實現,所以可得之前計算所產生的值都被壓棧了。現在所要做的操作也就是彈棧。)

現在開始返回,由於最後一次有效遞迴是solve(2,1,65)。所以把最後一次遞迴所產生的值815帶到上一層solve(1,-1,5)中。

此時執行的值為:

solve(1,-1,5);

for(i=1;i<3;i++)

sum=815-1*(1000/5)=615;

此時sum的值為615。

這一次返回有效(「有效」意為可以進行運算)。

繼續返回,這一次返回到了遞迴」頭「(solve(0,1,1))

此時執行的值為:

solve(0,1,1);

for(i=1;i<3;i++)

sum=1000+615=1615;

但現在還不能出來。還要重新進行新一輪遞迴。但運算方法與上面的一樣。

此時執行的值為:

solve(1,-1,5);

for(i=2;i<3;i++)

sum=1615-1*(1000/13)=1539;

接下來i=3,不符合條件,再一次返回。

這次返回到開頭(solve(0,1,1))

此時執行的值為:

solve(0,1,1);

for(i=2;i<3;i++)

sum=1000+1539=2539;

接下來i=3,不符合條件,再一次返回。可是這一次的位置已經是在開頭,沒有上層在繼續返回,所以整個遞迴函式段結束。

然後就是輸出2539了!

當然,原程式的執行原理也就是這樣了(同理可得),至於答案是怎麼算出來的,請讀者自己去算一下。(不要怪我沒說題目輸出是328)

解決在Matlab的solve函式中使用引數的問題

我們在使用matlab的solve這樣函式時,經常遇到這樣的情況,就是方程中含有一些已知引數以便加以控制,但是如何才能得到數值解?舉例如下 var1 100 要解var1 x 2 20 x 0這個方程,如果直接寫 solve var1 x 2 20 x 0 x 是不能得到正確解的。輸出結果為 ans...

MATLAB利用solve函式解多元一次方程組

matlab求解多元方程組示例 syms k1 k2 k3 k1 k2 k3 solve 3 k3 6,2 k1 k2 2 k3 11,2 k1 k2 k3 1 6 或者用 k1 k2 k3 solve 3 k3 6 2 k1 k2 2 k3 11 2 k1 k2 k3 1 6 另外,可以指定未知數...

程式呼叫匯入函式過程詳解

在日常的程式開發中共享庫的使用非常普遍,是 重用非常重要的技術。那麼程式是如何呼叫共享庫中的 段的呢?首先看一段彙編 如下圖,其中呼叫了兩個匯入函式messageboxa user32.dll 和exitprocess kernel32.dll 以第乙個函式為例進行分析,其中非常關鍵的一行 是 jm...