一道TCL的筆試題 遞迴

2021-05-18 06:05:06 字數 1083 閱讀 9601

題目:

在下面這個程式片段中的劃線處填上適當的表示式,使之逆序輸出陣列元素。

void recur(int a, int k)

}

這道題目要用遞迴的思想完成陣列元素的逆序排列,我們先來複習一下有關遞迴函式一般解題思路。

一般而言,遞迴函式要有乙個恰當的返回條件,以便到達那個條件的時候返回,不至於無窮巢狀進去,因此這個返回條件一定要在某個時候成立。另外,遞迴解決問題的思路就是:如果我要完成a任務,我必須先完成b任務,而要完成b任務,我又必須完成c任務……以此類推,就像經典的漢諾塔問題一樣,到最後只需要解決掉最簡單的那個任務即可,以此返回便能達到目的。如下圖:

回到這道題目來,如果給出乙個陣列,又假設此時令k=6,即要讓前6個元素逆序,我們可以這麼分解問題:要讓1,2,3,4,5,6逆序,我可以先讓2,3,4,5逆序,只要它們逆序了,我只需交換1和6即可;而要解決這第二個問題,我可以先讓3,4逆序,只要它們逆序了,我只需交換2和5即可,最後我只需交換3和4即可。因此交換序列中的中間兩個元素成為我們用遞迴思想解決這道題的第一步。

首先我們來確定返回條件,這個好辦,只要k值大於等於2,我們才有交換的必要,否則根本不需要交換。這個應該沒啥異議的,if語句裡面填的應該就是k>1或者k>=2。

下面是遞迴呼叫自身的時候,究竟需要傳遞什麼引數。前面已經分析過,我們在這道題中要一步步像剝洋蔥一樣地剝開這個陣列,而且我們注意到程式中最後三條語句是 a[0] 跟a[k-1] 在相互交換,因此這裡的 a[0] 必定是原來陣列不斷往後移動得來的,也就是說第乙個引數應該是 a+1 ,這樣,每次遞迴呼叫的時候 a[0] 就會依次往後移動。

從程式中可以看出,當最終從返回條件退出遞迴時要交換的是 a[0] 和 a[k-1] ,因此這裡的k就應該是子串行的長度(也就是每一次「剝洋蔥」之後的長度),顯然,每「剝」一次「洋蔥」序列的長度就減2(序列頭和序列尾除去),所以第二個引數應該每次減2,即k-2,所以答案是:

void recur(int a, int k)

}

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...