此題為筆試題的讀程式題。
題目程式**如下:
#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...