실습 14일차(Recursion)
귀착사상
귀속은 하나의 과정을 가리킨다. 함수는 인용의 대상이 알 때까지 끊임없이 자신을 인용한다.귀환은 함수 내부에서 자신의 함수를 호출하는 것을 귀환이라고 부른다.주말에 너는 여자 친구를 데리고 영화관에 가서 영화를 보는데, 여자 친구가 너에게 묻는다. 우리는 지금 몇 줄에 앉아 있니?영화관 안이 너무 어두워서 잘 안 보여서 셀 수가 없어요. 이제 어떡해요?귀속사상: 앞줄에 있는 사람에게 그가 몇 번째 줄인지 물어봐라. 그의 숫자에 1을 더하면 자신이 어느 줄에 있는지 알 수 있을 거야.그런데 앞사람도 잘 안 보이네요. 그래서 앞사람한테도 물어봤어요.이렇게 한 줄 한 줄 앞으로 가서 첫 번째 줄에 있는 사람에게 내가 첫 번째 줄에 있다고 말할 때까지 물었다. 그리고 이렇게 한 줄 한 줄 숫자를 되돌려 주었다.네 앞에 있는 사람이 너에게 그가 어느 줄에 있는지 알려줄 때까지 너는 답을 알게 될 것이다.이것은 매우 표준적인 귀속 구해 문제의 분해 과정으로 가는 과정을'집'이라고 하고 돌아오는 과정을'귀'라고 한다.기본적으로 모든 귀속 문제는 추이 공식으로 표시할 수 있다.방금 이 예에서 우리는 추이 공식으로 그것을 나타낸다. f(n)=f(n-1)+1 그 중에서 f(1)=1 f(n)는 네가 어느 줄에 있는지 알고 싶다는 뜻이고, f(n-1)는 앞에 있는 줄의 수를 의미하며, f(1)=1은 첫 번째 줄의 사람이 자신이 첫 번째 줄에 있다는 것을 안다는 뜻이다.
귀속되는 세 가지 조건
방금 이 예는 매우 전형적인 귀착이다. 그러면 도대체 어떤 문제를 귀착으로 해결할 수 있을까?나는 세 가지 조건을 총결하였는데, 아래의 세 가지 조건을 동시에 만족시키기만 하면, 귀환으로 해결할 수 있다.
반복 사례 작성
만약에 여기에 n개의 계단이 있다면 매번 당신은 1개의 계단 또는 2개의 계단을 건널 수 있습니다. 이 n개의 계단을 걷는 방법은 몇 가지가 있습니까?만약 7개의 계단이 있다면 너는 2, 2, 1, 이렇게 올라갈 수도 있고, 1, 2, 1, 1, 2, 이렇게 올라갈 수도 있다. 어쨌든 걷는 방법이 매우 많은데, 어떻게 프로그래밍으로 총 몇 가지 걷는 방법이 있는지 구할 수 있겠니?우리가 곰곰이 생각해 보면 실제로 첫 번째 걸음걸이에 따라 모든 걸음걸이를 두 종류로 나눌 수 있다. 첫 번째 걸음걸이는 한 계단, 다른 한 걸음걸이는 두 계단으로 나눌 수 있다.그래서 n계단의 걷는 방법은 먼저 1계단을 걷고 n-1계단을 걷는 방법과 먼저 2단계를 걷고 n-2단계를 걷는 방법과 같다.공식으로 표현하면 다음과 같다.
f (n) = f(n - 1) + f(n - 2)
추이 공식이 생겨서 귀속 코드는 기본적으로 반을 완성했다.종지 조건을 다시 한 번 봅시다.계단이 하나 있을 때, 우리는 더 이상 돌아갈 필요가 없다. 단지 하나의 걷는 방법일 뿐이다.그래서 f(1)=1.이 귀속 종지 조건은 충분합니까?우리는 n=2, n=3 이렇게 비교적 작은 수로 시험해 볼 수 있다.n=2시, f(2)=f(1)+f(0).만약 귀속 중지 조건이 f(1)=1만 있다면 f(2)는 해답을 구할 수 없습니다.그래서 f(1)=1이라는 귀속 종지 조건을 제외하고 f(0)=1도 있다. 이것은 0계단을 걷는 데 걷는 방법이 있다는 것을 의미하지만 이렇게 보면 정상적인 논리적 사고에 부합되지 않는다.그래서 우리는 f(2)=2를 일종의 종지 조건으로 삼아 두 계단을 걷는 것을 나타낼 수 있다. 두 가지 걷는 방법이 있는데 한 걸음이 끝나거나 두 걸음으로 나뉜다.따라서 귀속 중지 조건은 f(1)=1, f(2)=2이다.이때 당신은 n=3, n=4를 가지고 이 종지 조건이 충분하고 정확한지 검증할 수 있습니다.우리는 귀속 종지 조건과 방금 얻은 추이 공식을 함께 놓으면 다음과 같다.
f(1) = 1;
f(2) = 2;
f(n) = f(n-1)+f(n-2)
이 공식이 있으면 우리는 귀속 코드로 전환하는 것이 훨씬 간단해진다.최종 귀속 코드는 다음과 같습니다.
if (n == 1) return 1;
if (n == 2) return 2;
return f(n-1) + f(n-2);
}
요약:
인스턴스
인스턴스
def fact(n):
if n==1:
return 1
return n * fact(n -1)
위쪽은 곱셈을 실현하는 귀속 함수이니 우리가 한번 해 보자.
>>> fact(1)
1
>>> fact(5)
120
어리둥절할 수도 있으니 계산 과정을 살펴보자.
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
def fib(n):
if n <2:
return n
else:
return fib(n -1) + fib(n -2)
def hanoti(n,x1,x2,x3):
if(n == 1):
print('move:',x1,'-->',x3)
return
hanoti(n-1,x1,x3,x2)
print('move:',x1,'-->',x3)
hanoti(n-1,x2,x1,x3)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.