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