왜 학습의 귀착을 배워야 하는가
Ok, a big picture of sheep. Now he really lost it or? Actually, it's an analogy to Recursion, a lot of similar function invocations, almost same same but different ;) If you read on you will see Recursion explained and a few problems solved even.
나는 컴퓨터 과학에 관한 기초 시리즈를 쓰고 있다.왜 최신 JS 프레임워크나 유사한 것이 아니냐고 물어보십니까?
그래, 원인은 하나뿐이 아니야. 기초 지식을 이해하는 것은 영원한 기술이야. 네가 어떤 틀, 언어, 라이브러리를 배우든지 기초 지식은 계속 존재할 거야.
Ok, that sound like a textbook answer, are we supposed to buy that?
물론 더 많죠.나는 IT업계에서 십여 년 동안 일했다. 대량의 라이브러리와 언어를 사용한 후에 당신은 한동안 자신의 사고방식을 넓히고 이전에 보지 못했던 문제를 해결하며 심지어 새로운 방식으로 같은 문제를 해결할 수 있다는 것을 알게 될 것이다.
Is it fair to say you've just been solving problems, sometimes in a hacky way?
그래, 나는 우리가 모두 이 점을 증명할 수 있다고 생각한다. 때로는 우리의 해결 방안이 좋고, 때로는 그다지 좋지 않다고 생각한다.
솔직히 말하면 저는 대학에서 가장 열심히 공부하는 학생이 아닙니다. 저는 O기호, 알고리즘, 귀속, 컴파일러 등에 대해 연구를 많이 했고 마지막에 그 우아함을 얻고 감상할 때 기분이 좋습니다.
그래서 저는 이 시리즈의 첫머리에 귀속을 소개할 것입니다. 이것은 정복이 필요한 큰 개념입니다.나는 다음과 같은 몇 가지를 보여주고 싶다.
귀속은 무엇입니까
왜 귀속, 그것은 어떤 문제를 해결할 수 있는지, 왜 그것은 매우 우아한 방법인가
문제 해결은 진정으로 빛나는 일련의 문제와 어떻게 해결하는지 보여줄 것이다
귀속은 무엇입니까
반복되는 흔히 볼 수 있는 우스갯소리는 다음과 같다.
If you want to know what Recursion is, see Recursion
요컨대 귀환은 여러 번 자신을 호출하는 방법이다.
That sounds like a
while-true
loop like we are going to run out of memory
예, 이것은 귀환의 함정 중 하나입니다. 만약 당신이 잘못하면 다음과 같은 오류 메시지를 볼 수 있습니다.
무엇 때문에
Why on earth would I want to be calling myself x number of times?
이것은 너의 문제의 본질에 관한 것이다.몇몇 문제는 반복적으로 나타나는 모델로 볼 수 있으며, 너는 같은 해결 방안을 반복적으로 응용할 수 있다.
Ok, you'll have to explain that better.
물론 우리는 일련의 문제를 해결함으로써 우리의 뜻을 설명할 것이다.
Ok fair enough but you still haven't explained the why?
요컨대 우아함은 보통 아주 적은 몇 줄의 코드로 구성되어 있으며, 이것은 정확하게 작성된 귀속 해결 방안이다.코드까지 수정하는 인지적 부담이 크게 줄어든다는 뜻이다.
Ok I get that, everyone likes simple, what else?
귀속은 주로
for-loops
와 while
문장의 교체로 쓰인다.그것의 본질은 순환하거나 논리를 다시 응용하는 것이다.나는 공평하게 말하자면, 그것은 나누어 다스리는 방법이 있다고 생각한다.실제divide and conquer와 혼동하지 마라.내가 말하고 싶은 것은 우리가 우리의 문제를 천천히 극복했다는 것이다. 왜냐하면 우리가 본 것은 유사하고 유사한 패턴으로 가득 찬 데이터 집합이라는 것을 깨달았기 때문이다.이런 유사성은 같은 알고리즘을 반복적으로 응용하는 것을 가능하게 한다.You REALLY have to explain that
점점 줄어드는 데이터를 처리하기 시작하는 것은 우리가 조금씩 노력하는 것을 의미한다.일단 우리가 이 점에 도달하면, 우리는 문제가 이미 해결되었다고 생각한다.
우리는 어떤 문제를 해결할 수 있습니까?
이것은 불완전한 목록이기 때문에 이해할 수 있다.
요약: 목록의 모든 항목을 쉽게 요약할 수 있습니다
멱, 어떤 물건의 멱을 계산하는 것은 하나의 수에 그 자체의 x를 곱하는 횟수
factorial,factorial은 모든 숫자를 내림차순으로 곱하기
트리, 트리는 컴퓨터 과학의 많은 일에 사용된다. 예를 들어 컴파일러, 후예처리, 예를 들어 계산기 등
변환(예: 문자열을 숫자로 변환)
정렬, 귀속은 통상적으로 정렬 알고리즘을 실현하는 데 쓰인다. 예를 들어 통합 정렬을 실현하는 데 쓰인다.
몇 가지 문제를 해결하다
지금 코드를 보고 싶으실 텐데 전형적인 귀속 모습을 보여드리겠습니다.
function recursion(data) {
if(condition) {
return 'something'
} else {
recursion(data)
}
}
위에서 보듯이 IF 자문부터 시작하여 이를 기본 상황 또는 종료 조건이라고도 합니다.당분간 진정한 상태에 빠지지 않도록 이 조건을 충족시켜야 한다.ELSE 문구는 우리가 다시 자신을 호출하는 곳입니다. 보시다시피 우리는 방법을 다시 호출했습니다.
recursion()
이곳의 생각은 최종적으로 기본적인 상황에 도달하기 위해 약간 수정하는 것이다.이어서 우리는 진정한 문제들을 좀 보겠다.
계단의
계단에서 그 사상은 모든 숫자를 곱하는 것이다. 숫자 자체를 포함한다.숫자
5
의 경우 다음과 같은 계산이 필요합니다.5 * 4 * 3 * 2 * 1
위에서 보듯이 우리는 점점 기본 조건1
으로 떨어지는 일련의 숫자를 처리하고 있다.몇 가지 코드를 살펴보겠습니다.function factorial(num) {
if(num === 1) {
return 1;
} else {
return num * factorial(num -1);
}
}
나는 이런 해결 방안을 처음 보았을 때 머리가 폭발했다는 것을 인정해야 한다. 나는 그것을 받아들일 수 없다. 나는 이것이 심지어 효과적인 코드라고 생각한다. 또는 이런 for 순환을 사용하면 훨씬 간단할 것이라고 생각한다.function factorial(num) {
var sum = 1;
for(var i = num; i > 0; i--) {
sum *= i;
}
return sum;
}
나는 나의 과거의 자아를 이해한다. 너희들 중 일부도 이 글을 읽고 있다.뇌가 어떤 방식으로 연결되지 않는 한 그것을 처음 볼 때, 귀환은 고통스럽다.그렇다면 왜 해결 방안을 귀속시키는 것이 더 좋을까?적어도 나에게 이것은 간단한 것에 관한 것이다.만약 우리가 한 줄을 본다면:
return num * factorial(num -1);
여기서 우리가 고려한 것은 되돌아오기num
입니다. 우리가 다시 호출factorial()
할 때 나머지는 스스로 계산하도록 남겼고 이번에는 조정치num
입니다.나에게 있어서 가장 이해하기 어려운 것은 이것이 유효한 코드라는 것이다.나는 이것이 5 * 4 * 3 * 2 * 1
의 상황을 초래할 것이라는 것을 알 수 있다.나는 단지 컴파일러가 그것에 만족하는지 모르겠다.그러나 그것은 우리의 다음 문제를 불러일으켰다.문자열에서 숫자로의 변환
지금, 이것은 재미있는 예이다.우리가 어떤 물건을
"234"
에서 234
로 바꿀 때 무슨 일이 일어날지.응, 이것은 보충이야.네200 + 30 + 4
.그것은 어떤 모양입니까?A descending series?
예, 그렇습니다. 하지만 더 자세히 말하자면, 그것은 다음과 같습니다.
2 * 10^2 + 3 * 10 ^ 1 + 4 * 10 ^ 0
단계별로 파악한 내용을 토대로 스케치를 시작할 수 있습니다.currentcharacter * Math.pow(10, pow) + convert(character)
좋아, 우리 대체로 방법을 좀 이해하자.다음 문제는 우리의 기본 조건이 무엇입니까?정답은 우리가 한 캐릭터만 처리한다는 것이다. 이렇게:if (chars.length === 1) {
return parseInt(chars[0]);
}
위의 내용은 우리가 왼쪽에서 오른쪽으로 숫자를 처리할 것이며, 가장 왼쪽의 문자를 처리하면 처리된 것으로 간주되고, 우리는 비교적 작은 데이터 집합을 계속 처리해야 한다고 알려 준다.중요한 것은 우리가 기본 조건에 도달하기 위해 데이터 집합을 축소해야 한다는 것이다.나머지 코드를 살펴보겠습니다.function convert(num) {
let chars = (num + '');
if(chars.length === 1) {
return parseInt(chars[0])
} else {
let pow = chars.length -1;
return Math.pow(10, pow) * parseInt(chars[0]) + convert(num.substr(1));
}
}
else 조건을 확대합니다.else {
let pow = chars.length -1;
return Math.pow(10, pow) * parseInt(chars[0]) + convert(num.substr(1));
}
우리는 2* 10^2 + 3* 10^1 + 4
또는 "234"
의 내림차순 모델을 234
로 전환할 수 있음을 알 수 있다.그것이 떨어진 원인은 우리가 이렇게 했기 때문이다.convert(num.substr(1))
우리는 왼쪽에서 문자234
를 선택하여 34
로 바꾸고 마지막에 4
로 바꾸어 기본 조건에 도달했다.요약
나는 당신에게 나무와 대량의 다른 실현을 보여줄 수 있지만, 우리는 여기까지입니다.이것repo을 봐라. 나는 그 중에서 귀속으로 더 많은 문제를 해결했다.내가 말하고 싶은 것은 귀속이 무엇인지, 왜 그것이 어떤 문제에 있어서 더욱 간단하고 우아한 해결 방안인지이다. 물론 나도 귀속의 구조 블록과 이런 문제들을 해결할 때 어떻게 생각하는지 설명하고 싶다.
나는 이것이 교육적 의의가 있기를 바란다.만약 당신이 나에게 이 화제에 관한 후속 문장을 한 편 쓰게 하고 싶다면, 평론에서 나에게 알려주세요.
마지막으로, 당신은 귀환이 당신에게 적합하다는 것을 믿지 않을 수도 있습니다.나는 오래 머무르지 않았다.솔직히 나는 귀환이 가져오는 모델을 좋아한다.만약 당신이 일하는 일부분이 알고리즘을 작성하는 것이거나, 다음 코드전의 대가가 되기를 갈망하거나, 유명한 과학 기술 회사에 취직하는 것이라면, 이것은 당신이 알아야 할 일이다.루프도 언어의 일부이기 때문에 이 루프를 계속하십시오.
아니면 그들이 말한 것처럼 내가 사는 곳:
Keep calm and carry on :)
Reference
이 문제에 관하여(왜 학습의 귀착을 배워야 하는가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/itnext/why-you-should-learn-recursion-3dao텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)