【ルーキートレーニング】ソードフィンガーオファー641 + 2 +…+ nを求める(論理演算子)

タイトル説明:

1 + 2 +…+ nを求めます。乗算や除算などのキーワード、for、if、else、switch、case、および条件付き判定ステートメント(A?B:C)は使用できない必要があります。

例1:
入力:n = 3
出力:6

例2:
入力:n = 9
出力:45

制限:
1 <= n <= 10000
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/qiu-12n-lcof
著作権はLeetCodeが所有しています商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

問題解決のアイデア:

制限なしで、この問題を解決する方法はたくさんあります。たとえば、等差数列の合計式、反復、再帰などです。しかし、この質問は乗算と除算の使用を制限しているため、合計式は使用できません。forとwhileは使用できないため、反復は使用できません。残りの再帰についてはどうですか?ご存知のとおり、再帰をエクスポートする必要があります。一般に、条件付きの判断文をエクスポートに使用する場合、他の方法を使用してエクスポートできますか?

ソリューションを紹介する前に、まず知識を確認してください。論理演算子&&と||には短絡効果a && bがあり、aが偽の場合、システムはbが偽であるかどうかを検証しません。これは、それが何であっても、a && bの結果を変更しないためです。a || b、aが真の場合、システムはbが真であるかどうかを検証しません。これは、それが何であっても、a || bの結果を変更しないためです。

したがって、この問題では、論理演算子を使用してそれを解決できますか?もちろん、再帰ステートメントを&&の右側に配置し、再帰出口を左側に配置すると、出口がfalseの場合、システムは実行されません。 &&の右端なので、プログラムは再帰しません。これは私たちのニーズを満たします。

コード:

public class jianzhi_Offer_64 {
    
    
    public int sumNums(int n) {
    
    
    //注意此处必须为语句,所以我们可以造一个无关紧要的变量
    //逻辑与算符两端需要时boolean变量
        boolean flag =  (n != 0)&& ((n += sumNums(n - 1))!=0);
        return n;
    }



    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        jianzhi_Offer_64 obj = new jianzhi_Offer_64();
        System.out.println(obj.sumNums(n));
    }
}

注:コンストラクターを使用して解決することもできます。

おすすめ

転載: blog.csdn.net/Puppet__/article/details/115033872