來源:據說是某一年某個公司的面試題
題目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case 等關鍵字以及條件判斷語句(A?B:C)
分析:這題本來很簡單,但是不能用循環和條件判斷語句。但是理論上所有的遞歸都可以轉化爲循環,那是否可以用遞歸代替循環呢?照着這個思路走下去,貌似可以。可是用遞歸的話,遞歸怎麼終止呢?這就得在return語句中做文章了。最讓人奔潰的是不讓用乘除法。但是乘法本質上是加法的累加。
思路:
- 把循環化爲遞歸。
- 乘法改爲遞歸實現的累加。
- 遞歸的終止靠return語句做文章。
我最終的答案如下(包括測試程序):
#include <stdio.h>
int sum = 0;
_Bool summation(int n)
{
sum += n;
return n-1 && summation(n-1);
}
int main()
{
int n;
scanf("%d",&n);
summation(n);
printf("%d\n",sum);
return 0;
}
上面代碼最妙的地方在與return n-1 && summation(n-1),利用了&&的運算規則,解決了遞歸終止的問題。
編譯加上參數-std=c99,測試了幾個數據,結果正確。
後記:
1.不知道return語句中的 n-1 && summation(n-1)算不算判讀語句,算不算違規。如果不算的話,我覺得我的答案還是很簡單的。算的話,那我的答案就不合格了。
2.全局變量可以改成函數中的靜態變量,如果覺得全局變量不優雅的話。
3.根據網友Jujy給出的答案,他是用了宏定義和移位運算,答案比我這裏的稍顯麻煩,但他沒用遞歸,我沒看懂。
參考文檔:珍藏版]微軟等數據結構+算法面試100 題全部出爐 [完整100 題下載地址]:
http://download.csdn.net/source/2885434