왜 학습의 귀착을 배워야 하는가
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-trueloop 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)
  }
}
ELSE 문구는 우리가 다시 자신을 호출하는 곳입니다. 보시다시피 우리는 방법을 다시 호출했습니다.
recursion()이곳의 생각은 최종적으로 기본적인 상황에 도달하기 위해 약간 수정하는 것이다.이어서 우리는 진정한 문제들을 좀 보겠다.
계단의
계단에서 그 사상은 모든 숫자를 곱하는 것이다. 숫자 자체를 포함한다.숫자
5의 경우 다음과 같은 계산이 필요합니다.5 * 4 * 3 * 2 * 1
1으로 떨어지는 일련의 숫자를 처리하고 있다.몇 가지 코드를 살펴보겠습니다.function factorial(num) {
  if(num === 1) {
    return 1;
  } else {
    return num * factorial(num -1); 
  }
}
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 {
  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.)