반복해서 생각하다.귀속
6853 단어 programmingcomputersciencetech
이번에 우리는 컴퓨터 과학의 기본 개념을 배울 것이다. 너는 이미 그것의 이름을 알고 있다.
우리 시작합시다, 네?
일부 배경
우리가 귀환을 생각할 때, 가장 먼저 떠오르는 것은 무엇입니까?
그것들은 아마도 귀속에 대한 생각일 것이다. 이것은 우리가 귀속을 고려하고 있다는 것을 의미한다. 그리고...
우리는 지금 순환lol로 돌아가고 있다.
아...귀속, 이 개념은 자신의 정의를 인용하여 정의할 수 있고, 여전히 그것을 벗어날 수 있다.
나는 내가 대학에서 이 과목을 가르쳤을 때, 그것이 이해하기 어려웠고, 나는 아주 오랜 시간이 걸려서야 그것을 이해한 것을 기억한다.
이것은 주로 내가 지난 과정을'기본 명령식 프로그래밍'이라고 불렀기 때문이다.
이것은 나로 하여금 프로그램이 어떻게 실행되어야 하는지를 생각하는 데 익숙해지게 한다. 프로그램이 무엇을 해야 하는지 생각하는 것이 아니라.
이런 사고방식의 변화는'프로그램이 무엇을 해야 하는지 알려주면 당신보다 더 좋은 방법을 찾을 것이다'는 해방과 사고의 확장이다.
'귀환이 뭔지 말 안 했어요'라고 할 수도 있어요.
맞아요. 제 친구, 전 사진이면 충분했으면 좋겠어요. 하하하.
모든 농담은 제쳐두고 간단하게 말하면 귀속은 매우 유용하다.초기 "기본 상황"을 지정한 다음, 이 상황이 일치하지 않을 때 어떤 조작을 하는지 문제를 해결하는 방법
그래서 이것은 복잡한 문제를 해결하고 그것을 더 작은 문제로 분해하는 것과 같다.
그리고 나서 너는 이 문제들을 해결해라. 그러면 모든 다른 작은 문제에서 해결 방안을 얻을 수 있다.
좀 더 실제적인 관점에서 봅시다.
그러나 우리가 이렇게 하기 전에 이 글은 귀속된 강제적인 XKCD 이미지를 완성해야 한다.
좋아, 우리 이제 시작할 수 있어.
반복 예제
두 개의 가장 유명하고 고전적인 귀속 예는 곱하기와 피보나치 서열이다.
계단의
너는 아마도 기억하고 있을 것이다. 한 숫자의 곱하기는 숫자 뒤에 감탄호를 쓴 것이다. 예를 들어 5!결과는 로 나타날 수 있습니다.
5!=5x4x4x2x1
5! = 5 x 4 x 3 x 2 x 1
5!=5x4x4x2x1
그럼 8의 곱하기는 뭘까요?간단하게 7 이나 7의 곱셈의 8배입니다.
8!=8x7!
8! = 8 x 7!
8!=8x7!
우리는 1의 곱하기, 즉 1 자체를 찾을 때까지 계속할 수 있다.
그래서 우리는 그것을 가지게 되었다. 한 수의 곱하기는 이 곱하기 전의 한 수의 곱하기이다.
우리는 이렇게 표현할 수 있다.
곱하기 (n) = n∗단계 곱하기 (n)−1)
곱하기(n)=n*곱하기(n-1)
곱하기 (n) = n∗단계 곱하기 (n)−1)
우리는 지금 이 수학 함수를 이용해서, 그것을 이용하여 프로그램을 만들 수 있으며, 우리가 원하는 모든 숫자의 곱셈을 계산해 낼 수 있다.
factorial :: Integer -> Integer
factorial 1 = 1
factorial n = n * factorial(n-1)
이 함수는 하나의 정수를 받아들이고, 이 수의 곱셈 값 (다른 정수) 을 되돌려줍니다.우리가 언급한 원시 예시에 따르면 8의 곱셈은 40320으로 7의 곱셈의 8배이다.
피보나치 서열
이것은 또 다른 좋은 예이다. 만약 네가 수학 수업을 회상한다면, 그것은 일련의 숫자이며, 그 중에서 모든 숫자는 앞의 두 숫자의 총체이다.
서열 중의 열 번째 숫자는...
fib(10)=1,1,2,3,5,8,13,21,34,55
fib(10)=1,1,2,3,5,8,13,21,34,55
fib(10)=1,1,2,3,5,8,13,21,34,55
지금 너는 앞의 두 숫자가 실제로는 1이고, 그 다음에 그것들이 합쳐서 2가 되는 것을 볼 수 있다.
만약 10의 피보나치가 55라면 우리는 그것을 34 더하기 21의 합으로 쓸 수 있다. 만약 네가 알아맞히면 첫 번째 숫자는 피보나치가 1을 줄이고, 두 번째 숫자는 2를 뺀다.이렇게
fib(n)=fib(n)−1) +fib(n)−2)
fib(n)=fib(n-1)+fib(n-2)
fib(n)=fib(n)−1) +fib(n)−2)
우리는 함수를 두 번 사용하여 함수의 결과를 정의하는데, 이것은 이 함수들의 결과를 평가하기 위해 다른 두 함수를 제공할 것이다.
나는 이미 함수라는 단어를 여러 번 쓰기에 충분합니까?만일 그렇게 좋지 않다면...함수는 함수에 함수를 더하는 것과 같다.
우리는 어떻게 이 서열을 계산할 수 있는 프로그램을 만드는 데 착수합니까?
우리는 우리의 기본적인 상황과 이런 상황이 적용되지 않을 때 어떻게 해야 하는지를 이미 알고 있다.
fib :: Integer -> Integer
fib 1 = 1
fib 2 = 1
fib n = fib(n-1) + fib(n-2)
자, 이제 프로그램에 전달되는 모든 숫자의 서열 값을 계산할 수 있습니다.현재, 당신은 이미 이러한 예시들을 익혔을 뿐만 아니라, 더욱 고급스러운 것을 보고 싶을 뿐만 아니라, 그 중에서 더욱 재미있게 돌아가기를 원할 것이다.
이런 상황에서 이전의 예보다 더 재미있는 또 다른 예를 살펴보자.
한노타
이것은 확실히 더욱 재미있는 예다.이것은 이미 오랫동안 존재해 온 게임이다.
처음 만났을 때, 프로그래밍이나 수학에 대해 아무런 개념이 없었던 것은 좀 낙담스러웠다.
그럼에도 불구하고, 만약 당신이 정말로 나무로 만든 구조로 놀 수 있다면, 이것은 재미있는 게임이다.
그래도 돼 play the game online 원한다면.
이 게임의 목적은 모든 디스크를 기점에서 종점으로 이동하는 동시에 중간의 막대를 임시 위치로 사용하는 것이다.
디스크를 이동할 때는 반드시 두 가지 규칙을 준수해야 한다.
우리는 먼저 작은 것을 목적지로 이동한 후에 중간의 것을 임시 위치로 이동할 수 있다. 현재 우리는 세 개의 분리된 디스크가 있다.
그곳에서 작은 것을 임시로 옮기고 큰 것을 목적지로 옮긴다.
이제 작은 것을 기점으로 옮기고 중간을 종점으로 옮깁니다.
마지막으로 그곳의 녀석과 바다비움 바다비움, 완성했소.
만약 네가 계산해 보면 7걸음이면 3판으로 이길 수 있지만 4판은 15걸음, 5판은 31걸음이 필요하다.
현재, 우리는 이 과정을 통해 더 많은 디스크 (예: 10 또는 25) 의 문제를 해결할 수 있다고 추정할 수 있다.
귀속을 사용하면 3개의 디스크를 A점에서 C점으로 이동하는 데 필요한 과정은 n-1개의 디스크를 이동하는 과정과 같다고 할 수 있다.
우리의 생각은 소량의 디스크를 이동해서 최종 해결 방안을 찾을 때까지 단계별로 비슷한 문제를 해결하는 것이다.
이제 1개의 디스크를 이동할 때까지 디스크 이동 프로세스를 반복합니다.간단하죠?우리는 단지 그것을 주워서 반드시 가야 할 곳으로 옮겼을 뿐이다.
그래서 만약 당신이 지금까지 견지하고'네, 간단합니다.'라고 생각한다면 행동을 취할 때가 되었습니다.
이동 디스크의 전략과 기본 상황을 귀속 알고리즘으로 바꾸면 우리가 사용하고자 하는 모든 디스크의 문제를 해결할 수 있다.
디스크의 수가 증가함에 따라 절차의 수가 증가할 것이므로, 귀속 부하를 옮기는 데 더 많은 시간 (인내심) 이 필요하다는 것을 명심해라.
이제 귀속 로드까지...기억한다this comic
이 글이 너무 길지 않도록 저는 이 문제의 해결 방안을 당신들에게 남겨 두어 실현할 것입니다. 3개의 입력이 필요한 프로그램으로서
자, 이 글은 여기까지입니다.지금까지 읽어줘서 고마워요.
만약 네가 원한다면, 평론에 너의 해결 방안을 발표하거나, 나에게 연락해서, 네가 그것을 어떻게 실행할 것인지를 알게 해라.
다시 한 번 감사합니다. 다음에 뵐 수 있기를 바랍니다!
Reference
이 문제에 관하여(반복해서 생각하다.귀속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/juanfrank77/recursively-thinking-about-recursion-3l5c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)