Menu
Coddy logo textTech

재귀 함수: 팩토리얼

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

숫자의 팩토리얼(계승)은 재귀를 설명하기에 완벽한 고전적인 수학 연산입니다. 양의 정수 n의 팩토리얼(n!로 표기)은 1부터 n까지의 모든 양의 정수의 곱입니다. 예를 들어, 5! = 5 × 4 × 3 × 2 × 1 = 120입니다.

팩토리얼이 재귀에 이상적인 이유는 그것이 자연스럽게 더 작고 동일한 문제들로 나뉘기 때문입니다. 5!을 계산하려면, 이를 5 × 4!로 생각할 수 있습니다. 그리고 4!은 단지 4 × 3!일 뿐이며, 이런 식으로 계속됩니다. 이 패턴은 1과 같은 1!에 도달할 때까지 계속됩니다.

int factorial(int n) {
  if (n <= 1) {
    return 1; // 기저 사례
  }
  
  return n * factorial(n - 1); // 재귀 단계
}

기본 케이스는 n <= 1일 때 재귀를 중단하고 1을 반환합니다. 재귀 단계에서는 현재 숫자에 다음으로 작은 숫자의 팩토리얼을 곱합니다. factorial(5)를 호출하면 5 * factorial(4)를 반환하고, 이는 다시 5 * 4 * factorial(3)을 반환하는 식으로 기본 케이스에 도달할 때까지 계속됩니다.

이 접근 방식은 문제를 동일한 문제의 더 단순한 버전으로 축소함으로써 재귀가 어떻게 문제를 우아하게 해결하는지를 보여주며, 복잡한 계산을 자연스럽고 직관적으로 느껴지게 합니다.

challenge icon

챌린지

쉬움

재귀를 사용하여 여러 숫자의 팩토리얼을 계산하는 프로그램을 작성하세요. 이 프로그램은 숫자 목록을 처리하고 각 숫자의 팩토리얼을 계산함으로써 재귀적 팩토리얼 함수의 동작을 보여줍니다.

  1. 쉼표로 구분된 숫자들이 포함된 문자열 입력을 읽습니다 (예: "3,5,0,7")
  2. 입력 문자열을 개별 숫자로 분리하고 각각을 정수로 변환합니다
  3. 정수 매개변수 n을 받는 factorial이라는 이름의 재귀 함수를 생성합니다
  4. factorial 함수는 다음 로직을 구현해야 합니다:
    • 기본 케이스(Base case): 만약 n이 1보다 작거나 같으면, 1을 반환합니다
    • 재귀 단계(Recursive step): nfactorial(n - 1)을 곱한 값을 반환합니다
  5. 입력 목록의 각 숫자에 대해 재귀 함수를 사용하여 팩토리얼을 계산합니다
  6. 각 숫자와 그에 해당하는 팩토리얼 결과를 표시합니다
  7. 모든 팩토리얼 결과의 합계를 계산하고 표시합니다

예를 들어, 입력이 "4,3,2"인 경우 프로그램은 다음과 같이 출력해야 합니다:

Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfully

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

Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfully

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

Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfully

프로그램은 기본 케이스에 도달할 때까지 감소된 값으로 자기 자신을 호출하는 재귀적 factorial 함수를 구현해야 합니다. 이 함수는 재귀가 어떻게 팩토리얼 계산을 더 작고 동일한 하위 문제로 나누는지 보여주어야 합니다. 문자열 보간(string interpolation)을 사용하여 팩토리얼 결과를 "$n! = $result" 형식으로 출력하세요. 수학적 정의에 따라 0!은 1이며, 기본 케이스에서 이를 올바르게 처리해야 함을 기억하세요.

치트 시트

양의 정수 n의 팩토리얼(n!로 표기)은 1부터 n까지의 모든 양의 정수의 곱입니다. 예를 들어, 5! = 5 × 4 × 3 × 2 × 1 = 120입니다.

팩토리얼은 더 작고 동일한 문제들로 쪼개질 수 있기 때문에 재귀에 적합합니다. 예를 들어 5! = 5 × 4!, 4! = 4 × 3!과 같이 1! = 1에 도달할 때까지 계속됩니다.

int factorial(int n) {
  if (n <= 1) {
    return 1; // 기저 사례
  }
  
  return n * factorial(n - 1); // 재귀 단계
}

기저 사례는 n <= 1일 때 재귀를 멈추고 1을 반환합니다. 재귀 단계는 현재 숫자에 그보다 하나 작은 숫자의 팩토리얼을 곱합니다.

직접 해보기

import 'dart:io';

// TODO: 여기에 재귀 팩토리얼 함수를 작성하세요

void main() {
  // 쉼표로 구분된 숫자가 포함된 입력 문자열 읽기
  String? input = stdin.readLineSync();
  
  // 입력을 분리하고 정수로 변환
  List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
  
  // TODO: 아래에 다음을 수행하는 코드를 작성하세요:
  // 1. 팩토리얼 함수를 사용하여 각 숫자 처리
  // 2. 모든 팩토리얼의 합계 계산
  // 3. 요구된 형식으로 결과 표시
  
  print("Factorial Calculator");
  print("====================");
  print("Processing numbers: $numbers");
  print("====================");
  print("Factorial Results:");
  
  // TODO: 여기에 팩토리얼 결과를 계산하고 표시하세요
  
  print("====================");
  // TODO: 모든 팩토리얼의 합계 표시
  print("Calculation completed successfully");
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨