2016-07-12 12 views
1

今日の日付から次の閏年を探したいと思います。 EXのために今日の日付から次の閏年をCで探します。

。、

Date  NextLeapDate 
-----  ------------ 
2016-01-01 2016-02-29 
2016-05-24 2020-02-29 
2017-02-03 2020-02-29 

これは私がこれまでに次の閏年を取得しなければならないものですが、それは私に間違った値を取得しています、

public int GetNextLeapYear(int year) 
{ 
    bool isLeapYear = false; 

    while (true) 
    { 
     if (DateTime.IsLeapYear(year)) 
     { 
      isLeapYear = true; 
     } 
     else 
     { 
      year = year + 1; 
      GetNextLeapYear(year); 
     } 
     break; 
    } 
    return year; 
} 
+2

最初のif文に改行を入れるか、単にyearを返すだけです。oops jusはrecursionを見ました。読みにくく、jusはその呼び出しを取り除きます。 –

+0

システムコールの前に、内部コールが返すものを返します –

+2

また、関数をもう一度呼び出さないでください。elseブロックで 'GetNextLeapYear'を呼び出す必要はありません。両方ともではなく、ループまたは再帰を使用します。 –

答えて

4

何かを日はすでに終わっている)。そうすれば、2016年2月29日の結果は得られません。今日(このポストの時間)。このように使用

は、それが希望の日付を返します。

Console.WriteLine(GetNextLeapDate(new DateTime(2016, 01, 01))); // 2016-02-29 
Console.WriteLine(GetNextLeapDate(new DateTime(2016, 05, 24))); // 2020-02-29 
Console.WriteLine(GetNextLeapDate(new DateTime(2017, 02, 03))); // 2020-02-29 
+0

私はあなたが今年を確認したのが好きです。 – Shiva

1

あなたの現在のコードは、の一部にすぎませんプログラム?以下のコードは質問からコピーされ、私の提案編集(他の単純化と同様に)が正しく動作するように変更されています。

public int GetNextLeapYear(int year) 
{ 
    if (DateTime.IsLeapYear(year)) 
    { 
     return year; 
    } 
    else 
    { 
     year = year + 1; 
     return GetNextLeapYear(year); 
    } 
} 
+0

@pokeおっと、いいキャッチ、ありがとう! –

+0

@poke次回は "編集"リンクを使用できます。あなたの担当者は、自分の回答を直接編集することができます。 –

2

再帰は必要ありません。これを試してみてください:我々は(基準日が先に月のすでにある現在の年の場合(および場合のみ)チェックすなわち可能飛躍をスキップする必要が

DateTime GetNextLeapDate (DateTime baseDate) 
{ 
    int year = baseDate.Year; 

    // start in the next year if we’re already in March 
    if (baseDate.Month > 2) 
     year++; 

    // find next leap year 
    while (!DateTime.IsLeapYear(year)) 
     year++; 

    // get last of February 
    return new DateTime(year, 2, 29); 
} 

注:このような

public int GetNextLeapYear(int year) 
{ 
    while (true) 
    { 
     if (DateTime.IsLeapYear(year)) 
     { 
      return year; 
     } 
     year = year + 1; 
    } 
} 
1

次の閏年を見つけるために再帰を使用するには、そのようなあなたの方法を変更することができます。

public int GetNextLeapYear(int year) 
{ 
    if (!DateTime.IsLeapYear(year)) 
    { 
     return GetNextLeapYear(year + 1); 
    } 
    return year; 
} 

再帰を使用すると、Whileループは必要ありません。値を続行するか返す必要があるかどうかを確認するだけで済みます。これにより、必要のない変数を取り除くこともできます。 @pokeの回答は、実際にあなたが入っている月についてより完全な計算です。私は、あなたがしたように、再帰を使用し続けるために、この方法で答えました。

+0

'year'に代入する代わりにreturnを使用すると、末尾再帰が可能になります。できるだけ尾の再帰を常に試みてください。 –

+0

私はその変更がその問題を解決すると信じています。 – Nate

+0

これで十分です。最適化するには、「year = year + 1」行を取り除き、再帰呼び出しの引数として「year + 1」を指定してください) –

関連する問題