재귀 함수: 팩토리얼
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)을 반환하는 식으로 기본 케이스에 도달할 때까지 계속됩니다.
이 접근 방식은 문제를 동일한 문제의 더 단순한 버전으로 축소함으로써 재귀가 어떻게 문제를 우아하게 해결하는지를 보여주며, 복잡한 계산을 자연스럽고 직관적으로 느껴지게 합니다.
챌린지
쉬움재귀를 사용하여 여러 숫자의 팩토리얼을 계산하는 프로그램을 작성하세요. 이 프로그램은 숫자 목록을 처리하고 각 숫자의 팩토리얼을 계산함으로써 재귀적 팩토리얼 함수의 동작을 보여줍니다.
- 쉼표로 구분된 숫자들이 포함된 문자열 입력을 읽습니다 (예:
"3,5,0,7") - 입력 문자열을 개별 숫자로 분리하고 각각을 정수로 변환합니다
- 정수 매개변수
n을 받는factorial이라는 이름의 재귀 함수를 생성합니다 factorial함수는 다음 로직을 구현해야 합니다:- 기본 케이스(Base case): 만약
n이 1보다 작거나 같으면, 1을 반환합니다 - 재귀 단계(Recursive step):
n에factorial(n - 1)을 곱한 값을 반환합니다 - 입력 목록의 각 숫자에 대해 재귀 함수를 사용하여 팩토리얼을 계산합니다
- 각 숫자와 그에 해당하는 팩토리얼 결과를 표시합니다
- 모든 팩토리얼 결과의 합계를 계산하고 표시합니다
예를 들어, 입력이 "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");
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
1고급 리스트 조작
리스트 속성: first 및 last리스트 상태: isEmpty 및 isNotEmpty리스트 뒤집기리스트에 추가: insert리스트 요소 제거: removeWhere리스트에서 찾기: indexOf리스트 정렬리스트 섞기요약 - 리스트 정리 도구