剣指offer 64.1+2+...+nを求めます

1023 ワード

タイトルは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;
    }
}