Menu
Coddy logo textTech

再帰関数:カウントダウン

CoddyのDartジャーニー「論理とフロー」セクションの一部。レッスン 48/65。

では、シンプルなカウントダウン関数で再帰を実践してみましょう。この演習を通して、実際のコードでベースケースと再帰ステップがどのように連携するのかを理解できます。

countdown functionはnumberで始まり、各numberをゼロまで順にprintします。再帰によってこれがどのように動作するかを説明します。numberがゼロより大きい場合は、それをprintしてから、より小さいnumberを使って同じfunctionを呼び出します。numberがゼロに達したら、stopします。

void countdown(int number) {
  if (number <= 0) {
    print("Done!");
    return; // ベースケース - ここで停止
  }
  
  print(number);
  countdown(number - 1); // 再帰ステップ
}

ベースケースでは、number <= 0 かどうかを確認します。これは関数の呼び出しを停止するタイミングです。再帰ステップでは countdown(number - 1) を呼び出します。これは入力を小さくした同じ問題であり、徐々にベースケースへ近づいていきます。

countdown(3) を呼び出すと、3 を出力し、次に countdown(2) を呼び出します。これは 2 を出力し、次に countdown(1) を呼び出します。これは 1 を出力し、次に countdown(0) を呼び出します。これは「Done!」を出力して停止します。

challenge icon

チャレンジ

簡単

カスタムメッセージ付きの recursive カウントダウンタイマーを実装するプログラムを作成してください。プログラムは、指定された number からカウントダウンし、各 step でパーソナライズされたメッセージを表示することで、recursive を実演します。

  1. カウントダウンの開始 number を表す string input を Read する
  2. カスタムメッセージの prefix を表す string input(例: "Launch in""Timer"、または "Countdown")を Read する
  3. int.parse() を使用して最初の input を integer に Convert する
  4. 2つの parameter を受け取る customCountdown という recursive function を Create する:
    • 現在の countdown value を表す integer number
    • カスタムメッセージ用の string messagePrefix
  5. function は次のロジックを実装する必要があります:
    • Base case: number が 0 以下の場合、"Countdown complete!" を print して return する
    • Recursive step: message prefix に現在の number を続けて print し、その後 number - 1 を指定して自分自身を Call する
  6. Convert した number と message prefix を指定して customCountdown function を Call する
  7. 以下に示す exact format で結果を Display する

たとえば、input が "5""Launch in" の場合、プログラムは次のように出力します:

Starting countdown from: 5
Message prefix: Launch in
========================
Launch in 5
Launch in 4
Launch in 3
Launch in 2
Launch in 1
Countdown complete!

input が "3""Timer" の場合、プログラムは次のように出力します:

Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!

input が "0""Ready" の場合、プログラムは次のように出力します:

Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!

プログラムは、base case に到達するまで、decrement された number を指定して自分自身を Call する recursive customCountdown function を実装する必要があります。function は各 recursive call で現在の number とともにカスタムメッセージを print し、recursive によって問題がより小さく同一の subproblem に分解される仕組みを示す必要があります。string interpolation を使用して、カウントダウンメッセージを "$messagePrefix $number" として format してください。

自分で試してみよう

import 'dart:io';

// TODO: ここに customCountdown 関数を作成してください
// 基底ケース (number <= 0) と再帰ステップを処理することを忘れないでください

void main() {
  // 入力を読み取る
  String? startingNumber = stdin.readLineSync();
  String? messagePrefix = stdin.readLineSync();
  
  // 文字列を整数に変換する
  int number = int.parse(startingNumber!);
  
  // 初期情報を表示する
  print('Starting countdown from: $number');
  print('Message prefix: $messagePrefix');
  print('========================');
  
  // TODO: ここで customCountdown 関数を呼び出してください
  // Remember to handle null safety for messagePrefix
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン

自分で練習してみよう: Dartオンラインコンパイラ