C語言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等關鍵字以及條件判斷語句(A?B:C)

來源:據說是某一年某個公司的面試題

題目:求1+2+…+n,

要求不能使用乘除法、for、while、if、else、switch、case 等關鍵字以及條件判斷語句(A?B:C)

 


分析:這題本來很簡單,但是不能用循環和條件判斷語句。但是理論上所有的遞歸都可以轉化爲循環,那是否可以用遞歸代替循環呢?照着這個思路走下去,貌似可以。可是用遞歸的話,遞歸怎麼終止呢?這就得在return語句中做文章了。最讓人奔潰的是不讓用乘除法。但是乘法本質上是加法的累加。

思路:

  1. 把循環化爲遞歸。
  2. 乘法改爲遞歸實現的累加。
  3. 遞歸的終止靠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

 

發佈了134 篇原創文章 · 獲贊 243 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章