PHP - 재귀 함수
안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 PHP에서 재귀 함수의 fascineting 세계로 접근해 보겠습니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요; 저는 수년 동안 수많은 학생들에게 가이드를 해왔듯이 이 개념을 단계별로 안내해 드리겠습니다. 그러니 커피 한 잔 (또는 당신의 좋아하는 음료)을 챙기고, 이 흥미로운 여정에 함께 동행해 주세요!
재귀 함수는 무엇인가요?
구체적인 내용에 뛰어들기 전에 재귀 함수가 무엇인지 이해해 보겠습니다.镜子에 자신을 볼 때, 그 뒤에 또 다른镜子가 있다고 상상해 보세요. 무한한 반영이 보이지 않나요? 이것이 프로그래밍에서 재귀 함수가 작동하는 방식과 약간 유사합니다!
재귀 함수는 실행 중 자신을 호출하는 함수입니다. 러시아 인형들처럼 디지털 버전의 인형이 자신의 더 작은 버전을 안에 가지고 있는 것과 같습니다.
재귀 함수를 사용하는 이유는 무엇인가요?
"왜 함수가 자신을 호출하려고 할까요? 그것이 혼란스럽지 않나요?"라고 생각할 수도 있습니다. 하지만 재귀 함수는 반복적인 구조를 가진 문제를 해결하는 데 매우 유용할 수 있습니다. 이들은 우리의 코드를 더욱 우아하고 특정 유형의 문제를 이해하기 쉽게 만들 수 있습니다.
간단한 예제를 통해 발을濡濑해 보겠습니다:
function countDown($n) {
if ($n <= 0) {
echo "Blastoff!";
} else {
echo $n . "... ";
countDown($n - 1);
}
}
countDown(5);
이 함수를 countDown(5)
로 실행하면 다음이 happens:
- "5... "를 인쇄합니다.
- 그런 다음 4로 자신을 호출합니다.
- "4... "를 인쇄합니다.
- 3으로 자신을 호출합니다.
- 이와 같이 0에 도달할 때까지 계속합니다. 그런 다음 "Blastoff!"를 인쇄합니다.
출력은 다음과 같습니다: "5... 4... 3... 2... 1... Blastoff!"
재귀 함수의 구조
모든 재귀 함수에는 두 가지 주요 부분이 있습니다:
-
기본 사례: 재귀를 중지시키는 조건입니다. 이 없이는 함수가 영원히 자신을 호출하거나 (또는 컴퓨터의 메모리가 다 떨어질 때까지) 계속합니다!
-
재귀 사례: 함수가 자신을 호출하는 부분입니다. 일반적으로 매개변수가 수정된 상태로 호출됩니다.
우리의 카운트다운 예제에서, if ($n <= 0)
은 기본 사례이고, countDown($n - 1)
은 재귀 사례입니다.
재귀를 사용한 팩토리얼 계산
기본을 다 이해했으므로, 고전적인 문제를 풀어보겠습니다: 팩토리얼 계산. 수 n의 팩토리얼 (n!라고 쓰여짐)은 n 이하의 모든 양의 정수의 곱입니다.
예를 들어: 5! = 5 4 3 2 1 = 120
다음은 재귀를 사용하여 팩토리얼을 계산하는 방법입니다:
function factorial($n) {
if ($n <= 1) {
return 1;
} else {
return $n * factorial($n - 1);
}
}
echo factorial(5); // 출력: 120
이를 해부해 보겠습니다:
- 우리의 기본 사례는
if ($n <= 1)
입니다. 우리는 1!과 0!이 모두 1에 등しい 것을 알고 있으므로, 이 경우 1을 반환합니다. - 다른 모든 수의 경우, 우리는 $n을 (n-1)의 팩토리얼로 곱합니다.
factorial(5)
를 호출할 때, 배경에서 다음이 happens:
factorial(5) = 5 * factorial(4)
= 5 * (4 * factorial(3))
= 5 * (4 * (3 * factorial(2)))
= 5 * (4 * (3 * (2 * factorial(1))))
= 5 * (4 * (3 * (2 * 1)))
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120
이 함수가 기본 사례에 도달할 때까지 자신을 호출한 다음 결과가 반짝이는 것이 아름다운 것은 아닐까요?
재귀를 사용한 이진 검색
이제 단계를 높여 더 복잡한 예제를 살펴보겠습니다: 이진 검색. 이진 검색은 정렬된 항목 목록에서 항목을 찾는 효율적인 알고리즘입니다. 이는 반복적으로 목록의 절반을 나누어 항목이 있는 위치를 좁혀갑니다.
다음은 재귀를 사용하여 이진 검색을 구현하는 방법입니다:
function binarySearch($arr, $left, $right, $x) {
if ($right >= $left) {
$mid = $left + floor(($right - $left) / 2);
// 중간에 원소가 있는 경우
if ($arr[$mid] == $x) {
return $mid;
}
// 원소가 중간보다 작은 경우, 왼쪽 서브 배열에만 존재할 수 있습니다.
if ($arr[$mid] > $x) {
return binarySearch($arr, $left, $mid - 1, $x);
}
// 그렇지 않으면 원소는 오른쪽 서브 배열에만 존재할 수 있습니다.
return binarySearch($arr, $mid + 1, $right, $x);
}
// 원소가 배열에 없는 경우
return -1;
}
$arr = [2, 3, 4, 10, 40];
$x = 10;
$result = binarySearch($arr, 0, count($arr) - 1, $x);
echo ($result == -1) ? "Element is not present in array" : "Element is present at index " . $result;
이 함수는 처음에는 두려울 수 있지만, 해부해 보겠습니다:
- 우리는 오른쪽 인덱스가 왼쪽 인덱스 이상인지 확인합니다. 이는 우리의 계속 조건입니다.
- 우리는 중간 인덱스를 계산합니다.
- 중간 요소가 우리의 타겟인 경우, 우리는 완료입니다!
- 중간 요소가 타겟보다 큰 경우, 우리는 왼쪽 절반의 배열을 재ursively 탐색합니다.
- 중간 요소가 타겟보다 작은 경우, 우리는 오른쪽 절반의 배열을 재ursively 탐색합니다.
- 우리가 검색을 소진할 때 (오른쪽 < 왼쪽), 우리는 -1을 반환하여 원소가 배열에 없음을 나타냅니다.
이 재귀 접근의 아름다움은 문제를 자연스럽게 더 작은 하위 문제로 나누어 코드를 우아하고 이해하기 쉽게 만든다는 것입니다.
결론
재귀 함수는처음에는 마음을 꺾일 수 있지만, 프로그래머의 도구 상자에서 매우 강력한 도구입니다. 그들은 우리가 복잡한 문제를 우아하고 간결한 코드로 해결할 수 있게 해줍니다. 더 많이 연습할수록 재귀 솔루션을 사용할 수 있는 문제를 인식하게 될 것입니다.
기억하세요, 강력한 도구인 만큼 신중하게 사용해야 합니다. 때로는 반복적인 솔루션이 더 효율적이거나 이해하기 쉬울 수 있습니다. 경험이 쌓일수록 재귀를 사용할 때와 다른 접근 방식을 사용할 때를 알아차리게 될 것입니다.
계속 코딩하고, 실험하고, 가장 중요한 것은 즐겁게 만들어 보세요! 프로그래밍은 예술이자 과학이며, 재귀와 같은 개념을 습득하면 아름답고 효율적인 코드를 만들 수 있을 것입니다. 다음 번에 다시 뵙겠습니다. 행복한 코딩!
메서드 | 설명 | 예제 |
---|---|---|
countDown() | 주어진 숫자에서 0까지 카운트 다운 | countDown(5) |
factorial() | 주어진 숫자의 팩토리얼 계산 | factorial(5) |
binarySearch() | 정렬된 배열에서 원소 검색 | binarySearch($arr, 0, count($arr) - 1, $x) |
Credits: Image by storyset