劍指offer 64. 求1+2+…+n

題目轉載自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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章