題目描述:
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
解題思路:
本題本身沒有太多的實際意義,但是可以對程序員的發散思維能力進行考察,進而可以反映出對編程相關技術理解的深度。
對於本題,書中給出了利用構造函數、虛函數、函數指針、模板類型求解等思路,在這里,若使用java實現,有些方法卻是不適用的,比如構造函數法,java構造對象數組並不會多次調用構造函數,其他方法略顯復雜,這里我們給出另外一個思路:
可以通過遞歸來實現加法,但是由於無法使用if語句,因此對於遞歸的結束條件無法進行判斷,這里用一個比較巧妙的思路:與運算的短路特性,所謂短路,比如 A && B,當A條件不成立時,不論B是否成立,結果都是false,所以B不再進行計算,利用短路特性可以實現遞歸停止,進而求出和。
編程實現(Java):
public int Sum_Solution(int n) {
/*
等差數列求和:S=n(n+1)/2 無法使用
1.需利用邏輯與的短路特性實現遞歸終止。
2.當n==0時,(n>0)&&((sum+=Sum_Solution(n-1))>0)只執行前面的判斷,為false,然后直接返回0;
3.當n>0時,執行sum+=Sum_Solution(n-1),實現遞歸計算Sum_Solution(n)。
*/
int sum=n;
boolean ans = (n>0) && ((sum+=Sum_Solution(n-1))>0);
return sum;
}
