剣指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はいつ再帰的に終了すべきかを判断するため,ブール値を用いて判断した.論理演算子のショートエフェクト:
一般的な論理演算子には、「と&&」、「または重要な短絡効果は以下の通りである.
本題では,短絡効果により「n=1で再帰を終了する」という要件を実現する必要がある.n>1がtrueの場合、n+=sumNums(n-1)が実行される.そうでない場合は短絡し、後続の再帰を終了し、直接nに戻る
複雑度解析:時間複雑度O(n):n+(n−1)+...+2+1を計算するにはn個の再帰関数を開く必要がある.空間複雑度O(n):再帰深さがnに達し,システムはO(n)サイズの余分な空間を用いる.
コード実装
例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;
}
}