재귀 함수란 무엇인가요? 재귀를 어떻게 구현하나요?
재귀는 함수가 함수 본문 내에서 자신을 호출하는 것입니다. 재귀 함수를 실행하면 자신을 반복적으로 호출하여 매번 새로운 수준으로 들어갑니다. 재귀 함수에는 종료 조건이 있어야 합니다. ?
함수가 벽을 만나고 돌아올 때까지 계속 반복하면 벽이 종료 조건입니다. ?
따라서 재귀에는 종료 조건과 재귀 관계라는 두 가지 요소가 있어야 합니다.
재귀에는 두 가지 기본 요소가 있습니다.
(1) 경계 조건: 재귀 종료라고도 하는 재귀가 종료되는 시기를 결정합니다.
(2) 재귀 모드: 큰 문제를 재귀 본문이라고도 하는 작은 문제로 분해하는 방법입니다. 이 두 요소를 통해서만 재귀 함수는 제한된 수의 계산 후에 결과를 얻을 수 있나요?
재귀 함수에서는 호출하는 함수와 호출되는 함수가 동일한 함수라는 점에 유의해야 합니다. 함수 호출 레벨, 재귀 함수를 호출하는 주 함수를 레벨 0이라고 하면, 함수에 들어간 후 자신에 대한 첫 번째 재귀 호출을 레벨 1 호출이라고 합니다. 레벨 i의 재귀 호출을 레벨 i+1이라고 합니다. 반대로 i+1번째 레이어 호출을 종료하면 i번째 레이어로 돌아가야 합니다.
재귀 함수의 호출 프로세스는 호출 함수와 호출된 함수가 동일한 함수라는 점을 제외하면 여러 함수의 중첩 호출과 유사합니다. 재귀 함수의 올바른 실행을 보장하려면 시스템에서 작업 스택을 설정해야 합니다. 구체적으로 재귀 호출의 내부 실행 프로세스는 다음과 같습니다.
(1) 이동이 시작되면 먼저 재귀 호출을 위한 작업 스택이 설정되며, 그 구조에는 값 매개 변수, 지역 변수 및 반환이 포함됩니다. 주소;
(2) 각 재귀 호출 전에 재귀 함수의 값 매개변수, 지역 변수의 현재 값, 호출 후 반환 주소를 스택에 푸시합니다.
(3) 각 재귀 호출의 끝 마지막으로 스택의 최상위 요소를 이동합니다.
확장 정보:
재귀는 함수가 직접 또는 간접적으로 자신을 호출하는 것을 의미합니다. 호출을 재귀 호출이라고 합니다. 직설적으로 말하면 여전히 함수 호출입니다. 함수 호출이기 때문에 흔들리지 않는 원칙이 있습니다. 호출된 모든 함수는 복사본을 생성하며 각 함수는 다른 함수의 영향을 받지 않고 호출자에게 서비스를 제공합니다.
ff 함수는 반복되는 만큼의 복사본을 갖게 되며 메모리의 스택 관리를 사용하여 역방향으로 종료됩니다. 이를 위해 "스택"과 같은 것을 찾는 것이 가장 좋습니다. 마치 잡지처럼 먼저 들어가고 나중에 나오는 것은 매우 쉽습니다.
어떤 의미에서는 이는 잘못된 것입니다. 방금 언급한 것처럼 일단 호출되면 메모리에 있는 코드 복사본을 복사하고 다시 호출되면 다른 복사본을 복사하기 때문입니다. 즉, 동일한 함수에 대한 여러 호출을 여러 다른 함수에 대한 한 번의 호출로 참조할 수 있으므로 더 쉽습니다.
=1과 =0이 종료되는 이유에 대해 이야기해 보겠습니다. 재귀(recursion), 주목해야 할 것은 데드 재귀(dead recursion) 즉, 특정 함수가 자신을 무한히 호출하여 메모리 등의 자원을 끝없이 소모하는 상황에 빠지는 것입니다.
모든 재귀 함수에는 이전 수준의 함수를 반환할 수 있는 코드가 어딘가에 있어야 합니다. 그렇지 않으면 재귀적입니다. ff 함수에서 else는 return 종료라고 생각하면 됩니다. 판단할 if가 없으면 언제 재귀가 완료되나요? ff는 항상 자신을 호출합니까?
함수 A가 함수 B(또는 그 자체)를 호출하면 A의 코드는 호출 위치에서 중지되고 실행을 위해 B로 전환됩니다. 마찬가지로 B가 함수 C를 다시 호출하면 B는 호출 위치에서 중지됩니다. 호출 위치를 찾아 C를 실행합니다. 무한히 호출하면 프로그램은 절대 끝나지 않습니다.
물론 A가 B를 호출한 후 B의 생사에 관계없이 자체 코드를 계속하는 상황도 있습니다. 이는 다른 프로그래밍 방법을 포함하기 때문에 논의 범위에 포함되지 않습니다. : 멀티스레딩.
참고 자료: 바이두 백과사전 - 재귀 함수