題目轉載自Leetcode
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
示例 1:
輸入: n = 3
輸出: 6
示例 2:
輸入: n = 9
輸出: 45
限制:
1 <= n <= 10000
題解 遞歸法
題解轉載自LeetCode作者Krahets
因爲不能使用if,else來判斷什麼時候應該遞歸終止,所以使用布爾值來進行判斷。
邏輯運算符的短路效應:
常見的邏輯運算符有三種,即 “與 && ”,“或 ∣∣ ”,“非 ! ” ;而其有重要的短路效應,如下所示:
if(A && B) // 若 A 爲 false ,則 B 的判斷不會執行(即短路),直接判定 A && B 爲 false
if(A || B) // 若 A 爲 true ,則 B 的判斷不會執行(即短路),直接判定 A || B 爲 true
本題需要實現 “當 n=1 時終止遞歸” 的需求,可通過短路效應實現。
若n>1爲true,則執行n+=sumNums(n-1)。否則此時短路,終止後續遞歸,直接返回n
n > 1 && sumNums(n - 1)
複雜度分析:
時間複雜度 O(n) : 計算 n+(n−1)+…+2+1 需要開啓 n 個遞歸函數。
空間複雜度 O(n) : 遞歸深度達到 n ,系統使用 O(n) 大小的額外空間。
代碼實現
class Solution {
int res=0;
public int sumNums(int n) {
//若n>0,纔會執行n+=sumNums(n-1),即此遞歸的終止條件是n>0
boolean x =n >1 && (n+=sumNums(n-1))>0;
return n;
}
}