By SmartPtr(http://m.shnenglu.com/SmartPtr/)
今天在網(wǎng)上無(wú)意間看到一道筆試題,初看十分簡(jiǎn)單,再看要求發(fā)現(xiàn)還是比較曲折的:
函數(shù)原形已經(jīng)給出:int p(int i, int n);
功能:調(diào)用該函數(shù),打印如下格式的輸出,例p(1, 7);
1
2
3
4
5
6
7
6
5
4
3
2
1
即每行一個(gè)數(shù)字。(注意:N只打印一次)
要求:
函數(shù)中唯一能夠調(diào)用的函數(shù)就是printf。
只使用一條語(yǔ)句,如果你真的不能用一條語(yǔ)句,每增加一條語(yǔ)句扣1分。
不準(zhǔn)使用如下的關(guān)鍵字:typedef, enum, do, while, for, switch, case, break, continue, goto,
until, if, ..具體很多我也忘了,反正能用的不多。
不能使用逗號(hào)表達(dá)式和?:表達(dá)式。
標(biāo)準(zhǔn):(總分10分)
1. 每多一條語(yǔ)句扣1分,即每多一個(gè);就扣1分
2. 每使用一次if或?:扣2分
3. 每使用一次for,while, swith各扣4分
初看,打印出這些數(shù)字,簡(jiǎn)單!我們剛學(xué)C的時(shí)候什么沒(méi)打印過(guò)啊, 再往下看,不能用循環(huán),不能用條件判斷, 而且只能用一條語(yǔ)句。。。。。
我們來(lái)分析一下困難與可能的解決辦法:
1.不能用循環(huán),要打印出那么多數(shù)字,只有一個(gè)辦法了,那就是遞歸
2.不能用條件判斷,我們知道,遞歸是需要有終止條件的,不然就無(wú)窮遞歸了,那么我們需要作條件判斷來(lái)終止遞歸,可是那些常用的條件判斷語(yǔ)句又不能用,怎么辦? 看看C中的&&運(yùn)算符:
expression1 && expression2;
只有在Expression為true的情況下,才會(huì)繼續(xù)執(zhí)行expression2,這也就相當(dāng)于條件判斷語(yǔ)句
if(expression1) expression2;
好,這兩個(gè)問(wèn)題都有了相應(yīng)的解決方案,現(xiàn)在要做的就是用你的邏輯把這些語(yǔ)句巧妙的組合起來(lái), 可以說(shuō)答案是多種多樣的,下面就是一個(gè)比較簡(jiǎn)單的:
int p(int i, int n)
{
return ((i < n && printf("%d\n",i) && p(i+1,n)) || 1) && (printf("%d\n",i));
}
打印1,2,3,4,5,6是在遞歸的時(shí)候, 而打印7,6,5,4,3,2,1則是在遞歸回歸的時(shí)候, 前一個(gè)語(yǔ)句要“或”一下1,就是為了保證后面的打印語(yǔ)句在回歸時(shí)能夠執(zhí)行到。
可能很多人會(huì)覺(jué)得這種筆試題沒(méi)有什么意義, 因?yàn)樵趯?shí)際項(xiàng)目中不可能寫(xiě)這么tricky的代碼,寫(xiě)的麻煩,讀的心煩,維護(hù)起來(lái)亂成一團(tuán)。。。但是這短短的一句語(yǔ)句,卻是十分考驗(yàn)人的,對(duì)遞歸算法,對(duì)C運(yùn)算符,對(duì)邏輯智商都是有著不低的要求。所以,我覺(jué)得這是一個(gè)好題,好到讓我擔(dān)心沒(méi)人能在規(guī)定時(shí)間里做出來(lái):)
posted on 2007-08-04 22:13
SmartPtr 閱讀(1757)
評(píng)論(15) 編輯 收藏 引用