Menu
Coddy logo textTech

재귀 함수: 카운트다운

Coddy Dart 여정의 로직 & 흐름 섹션에 포함된 레슨 — 65개 중 48번째.

이제 간단한 카운트다운 함수를 통해 재귀를 실제로 적용해 볼 시간입니다. 이 연습은 실제 코드에서 기본 케이스(base case)와 재귀 단계(recursive step)가 어떻게 함께 작동하는지 이해하는 데 도움이 될 것입니다.

카운트다운 함수는 숫자로 시작하여 0까지 각 숫자를 출력합니다. 재귀가 이를 작동시키는 방식은 다음과 같습니다: 숫자가 0보다 크면, 그 숫자를 출력한 다음 더 작은 숫자로 동일한 함수를 호출합니다. 숫자가 0에 도달하면 멈춥니다.

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을 출력한 다음 "Done!"을 출력하고 멈추는 countdown(0)을 호출합니다.

challenge icon

챌린지

쉬움

사용자 정의 메시지를 사용하는 재귀 카운트다운 타이머를 구현하는 프로그램을 작성하세요. 이 프로그램은 주어진 숫자부터 카운트다운을 하고 각 단계에서 개인화된 메시지를 표시함으로써 재귀(recursion)를 보여줍니다.

  1. 카운트다운의 시작 숫자를 나타내는 문자열 입력을 읽습니다.
  2. 사용자 정의 메시지 접두사(예: "Launch in", "Timer", 또는 "Countdown")를 나타내는 문자열 입력을 읽습니다.
  3. int.parse()를 사용하여 첫 번째 입력을 정수로 변환합니다.
  4. 두 개의 매개변수를 받는 customCountdown이라는 재귀 함수를 생성합니다:
    • 현재 카운트다운 값을 나타내는 정수 number
    • 사용자 정의 메시지를 위한 문자열 messagePrefix
  5. 함수는 다음 로직을 구현해야 합니다:
    • 기본 케이스(Base case): 숫자가 0보다 작거나 같으면, "Countdown complete!"를 출력하고 반환합니다.
    • 재귀 단계(Recursive step): 메시지 접두사와 현재 숫자를 출력한 다음, number - 1로 자기 자신을 호출합니다.
  6. 변환된 숫자와 메시지 접두사를 사용하여 customCountdown 함수를 호출합니다.
  7. 아래에 표시된 정확한 형식으로 결과를 표시합니다.

예를 들어, 입력이 "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!

입력이 "3""Timer"인 경우, 프로그램은 다음과 같이 출력해야 합니다:

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

입력이 "0""Ready"인 경우, 프로그램은 다음과 같이 출력해야 합니다:

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

프로그램은 기본 케이스에 도달할 때까지 감소된 숫자로 자기 자신을 호출하는 재귀 함수 customCountdown을 구현해야 합니다. 이 함수는 각 재귀 호출 시 현재 숫자와 함께 사용자 정의 메시지를 출력하여, 재귀가 문제를 더 작고 동일한 하위 문제로 어떻게 나누는지 보여주어야 합니다. 문자열 보간(string interpolation)을 사용하여 카운트다운 메시지를 "$messagePrefix $number" 형식으로 구성하세요.

치트 시트

재귀적 카운트다운 함수는 숫자를 0까지 거꾸로 세면서 재귀가 어떻게 작동하는지 보여줍니다:

void countdown(int number) {
  if (number <= 0) {
    print("Done!");
    return; // 기본 케이스 - 여기서 중단
  }
  
  print(number);
  countdown(number - 1); // 재귀 단계
}

기본 케이스(base case)는 재귀를 중단하기 위해 number <= 0인지 확인합니다. 재귀 단계(recursive step)number - 1과 함께 동일한 함수를 호출하여 기본 케이스를 향해 나아갑니다.

countdown(3)을 호출하면, 감소된 값으로 연속적인 재귀 호출을 수행하여 3 → 2 → 1 → "Done!"을 출력합니다.

직접 해보기

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 함수를 호출하세요
  // messagePrefix의 null 안정성 처리를 기억하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨