반복 표시
15143 단어 computersciencealgorithmsjavascript
막 졸업한 소프트웨어 공학 전공 졸업생으로서 나는 기술 면접을 준비하는 데 많은 시간을 썼다.이 과정의 일부는 데이터 구조와 알고리즘에 대한 지식을 더 많이 배우는 것이다.이 문장에서 나는 왜 유용한지, 그리고 우리가 그것을 어떻게 실현하는지 토론할 것이다.나는 또한 두 가지 흔히 볼 수 있는 귀속 예시를 연구할 것이다. 어떻게 숫자를 1에서 n으로 구하고, 어떻게 귀속 반전 문자열을 사용하는지.
귀속은 무엇입니까?
우리는 만약 함수가 서브루틴으로 자신을 호출한다면 그것은 귀속된다고 말할 수 있다.개인적으로 말하자면, 비록 이것은 이론적으로 의미가 있지만, 귀속되는 작업 원리를 진정으로 이해하려면 시간이 좀 걸릴 수 있다는 것을 알게 되었다.본질적으로 우리가 하는 일은 호출 함수 자체를 통해 일부 문제를 더욱 작은 문제로 분해하는 것이다.일단 우리가 문제를 해결할 수 있고 더 이상 간소화할 필요가 없는 점에 도달하면, 우리는 귀속 호출을 멈추고 답안을 되돌려준다.
교체가 아니라 귀속을 언제 사용합니까?
귀속과 교체는 통상적으로 문제를 유사하게 해결하는 데 쓸 수 있다.그렇다면 우리는 왜 간단한 교체 해결 방안이 아니라 귀속 해결 방안을 선택해야 합니까?결정을 내리려면 다음과 같은 몇 가지를 고려해야 한다.
귀속 원소
반복 함수를 만들 때는 다음 요소를 포함해야 합니다.
사진 작성자@benji3pr
반복 함수 예
예1: 1부터 n까지 귀속구화
이 예에서는 숫자 n을 가져와 1에서 n까지의 모든 숫자의 합을 반환하는 함수를 작성합니다.
const recursiveSumToN = (n) => {
if (n <= 1) {
return n;
} else {
return n + recursiveSumToN(n - 1);
}
}
recursiveSumToN(5);
// 15
우리가 Recursive SumTon(5)을 호출할 때, 우리는 1+2+3+4+5의 합을 얻어 15와 같다.이 기능은 어떻게 작동합니까?위에서 말한 바와 같이 우리는 기본 상황, 기본 상황에 도달하는 논리와 귀속 호출이 필요하다.다음은 이러한 역할을 수행하는 코드 행에 대한 설명입니다.
const recursiveSumToN = (n) => {
if (n <= 1) {
// BASE CASE: We want to count the numbers from 1 to n, so we need to stop when n === 1.
return n;
} else {
// LOGIC TO REACH BASE CASE AND RECURSIVE CALL: If n is > 1, we haven't reached our base case, so we need to call our function again.
return n + recursiveSumToN(n - 1);
}
}
recursiveSumToN(5);
// 15
그래서 n, 즉 입력, 1보다 크면 우리의 함수는 n-1을 사용하여 자신을 호출한다.끊임없이 n을 1로 줄이는 것을 통해 우리는 기본적인 상황을 향해 노력하고 있기 때문에 무한순환으로 끝나지 않는다.이러한 기능은 다음과 같습니다.
recursiveSumToN(5)
// this translates to:
recursiveSumToN(4) + 5
// =>
recursiveSumToN(3) + 4
// =>
recursiveSumToN(2) + 3
// =>
recursiveSumToN(1) + 2
// 1
이 함수는 두 단계로 나뉘어 일한다.기본 상황에 도달할 때까지 recursiveSumTon을 반복해서 호출합니다.일단 이 기본 상황이 완성되면, 그것은 다른 함수 호출을 해석하기 시작한다.콘솔을 추가하는 것도 유용하다.코드에 로그인하여 이벤트 발생 순서를 확인합니다.
const recursiveSumToN = (n) => {
console.log("n: " + n);
if (n <= 1) {
console.log("We've hit the base case!");
return n;
} else {;
return n + recursiveSumToN(n - 1);
}
}
recursiveSumToN(5);
// n: 5
// n: 4
// n: 3
// n: 2
// n: 1
// We've hit the base case!
// 15
그래서 n은 매번 1을 줄이고 우리가 기본적인 상황에 도달할 때까지 함수는 우리의 답안을 되돌려준다.사진 작성자@robertbye
예 2: 반복 반전 문자열
두 번째 예에서 우리는 문자열, 문자열을 받아들이고 반전시키는 함수를 볼 것이다.이 문제는 여러 가지 방법으로 해결할 수 있는 문제이며, 교체를 포함하지만, 잠재적인 귀속 해결 방안을 살펴볼 것이다.
function recursiveReverseString(string) {
if (string === "") {
return "";
}
else {
return recursiveReverseString(string.substr(1)) + string.charAt(0);
}
}
recursiveReverseString("hello");
// olleh
보시다시피 이 함수의 출력은 원시 문자열과 상반된다.이런 상황에서'안녕'은'올리'로 바뀌었다.아래에서 우리는 기본 상황, 논리와 귀속 호출을 볼 수 있다.
function recursiveReverseString(string) {
if (string === "") {
// BASE CASE: Once the string is empty, we have reached our base case.
return "";
}
else {
// LOGIC TO REACH BASE CASE AND RECURSIVE CALL: One character is removed each time the function is called until we reach our base case.
return recursiveReverseString(string.substr(1)) + string.charAt(0);
}
}
recursiveReverseString("hello");
// olleh
우리는 또 일부 컨트롤러를 추가할 수 있다.각 호출에서 문자열의 변경 사항을 보려면 다음과 같이 기록합니다.function recursiveReverseString(string) {
if (string === "") {
console.log("string: " + string);
console.log("We've hit the base case!");
return "";
}
else {
console.log("string: " + string);
return recursiveReverseString(string.substr(1)) + string.charAt(0);
}
}
recursiveReverseString("hello");
// string: hello
// string: ello
// string: llo
// string: lo
// string: o
// string:
// We've hit the base case!
// olleh
RecursiveVerseString 함수를 호출할 때마다 빈 문자열이 나올 때까지 한 문자만 줄일 수 있습니다.그리고 함수는 모든 호출을 해석하고 원시 문자열과 반대되는 문자열을 출력합니다.연습하다
귀환을 실현할 수 있는 것은 특히 기술 면접에서 매우 유용하다.HackerRank,Codewars와 LeetCode는 여러 가지 귀속 연습을 바탕으로 당신에게 더 많은 내용, 발전 기능과 연습을 배울 수 있습니다.
출처
Reference
이 문제에 관하여(반복 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ionabrabender/recursion-revealed-4gn3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)