再帰関数:カウントダウン
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!」を出力して停止します。
チャレンジ
簡単カスタムメッセージ付きの recursive カウントダウンタイマーを実装するプログラムを作成してください。プログラムは、指定された number からカウントダウンし、各 step でパーソナライズされたメッセージを表示することで、recursive を実演します。
- カウントダウンの開始 number を表す string input を Read する
- カスタムメッセージの prefix を表す string input(例:
"Launch in"、"Timer"、または"Countdown")を Read する int.parse()を使用して最初の input を integer に Convert する- 2つの parameter を受け取る
customCountdownという recursive function を Create する: - 現在の countdown value を表す integer
number - カスタムメッセージ用の string
messagePrefix - function は次のロジックを実装する必要があります:
- Base case: number が 0 以下の場合、
"Countdown complete!"を print して return する - Recursive step: message prefix に現在の number を続けて print し、その後
number - 1を指定して自分自身を Call する - Convert した number と message prefix を指定して
customCountdownfunction を Call する - 以下に示す 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
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
1リスト操作の応用
リストのプロパティ: first と lastリストの状態: isEmpty と isNotEmptyリストの反転リストへの追加: insertリストの削除: removeWhereリスト内の検索: indexOfリストのソートリストのシャッフルまとめ - リストオーガナイザー自分で練習してみよう: Dartオンラインコンパイラ