SICP 문제(1.19) 문제 요약

1970 단어
SICP 연습 문제 1.19는 대수 걸음수로 피보나계수를 구할 것을 요구했다. 피보나계수와 관련해 우리는 연습 문제 1.13에서 토론한 적이 있다. 책에서 1.2.2절도 피보나계수의 구법을 상세하게 설명했다.1.2.2절에서 피보나치수의 귀속구법과 교체구법을 설명했는데 그 중에서 귀속구법의 걸음수는 Fib(n)이고 교체구법의 걸음수는 n에 비해 선형이다.비록 교체구법의 걸음 수는 이미 매우 적지만 우리는 한 가지 방법을 통해 걸음 수를 대수 걸음 수로 줄일 수 있다. 그 중에서 관건은 앞에서 언급한 두 개의 연속 변환을 한 번의 변환 방법으로 바꾸는 것이다.
반복 구법에서 관건은 다음과 같은 변환이다.
Fib(0)를 구하여 b1로 설정합니다.
Fib(1)를 구하여 a1로 설정합니다.
피보나치 수로 정의하면 a1+b1은 Fib(2)
이어 b2를 a1, a2를 a1+b1로 하면 a2+b2가 Fib(3)
이렇게 계속 바꾸면 a(n-1)+b(n-1)를 통해 Fib(n)를 구할 수 있다.
현재의 관건은 상기 변환 중의 연속 두 번의 변환을 한 번의 변환으로 바꾸는 방법을 찾아내는 것이다.
우선 성명합니다. 이것은 제 생각에는 머리를 깨뜨려도 생각나지 않습니다. 저는 책 제목의 힌트에 따라 왔습니다.
우선 우리가 정리한 대로,
유등식1:
b2=a1
a2=a1+b1

이어서 책의 힌트에 따라 등식 2로 등식 1을 표현한다.
등식2:
b2=b1p+a1q
a2=b1q+a1q+a1p

등식 2 로 얻을 수 있는 것은:
등식 3:
b3=b2p+a2q
a3=b2q+a2q+a2p

등식 2를 등식 3에 대입합니다.
b3 = b2p+a2q = (b1p+a1q)p+(b1q+a1q+a1p)q 
=>b3 = b1pp + a1qp + b1qq + a1qq + a1pq
=>b3= b1(pp + qq)  +  a1 (qp + qq + pq)
=>b3= b1 (pp + qq) + a1 (qq + 2pq)

a3 = b2q+a2q+a2p = (b1p+a1q)q+(b1q+a1q+a1p)q+(b1q+a1q+a1p)p
=> a3= b1pq + a1qq + b1qq + a1qq + a1pq + b1qp + a1qp + a1pp
=> a3= b1 (pq + qq + qp) + a1(qq + qq +pq+ qp + pp)
=> a3= b1 (pq + qq + pq) + a1(qq + pp) + a1 (qq + pq + qp)
=> a3=b1(qq+2pq) + a1(qq + pp) + a1(qq +2pq)

명령p2=(pp+qq)q2=(qq+2pq)
다음과 같은 이점이 있습니다.
b3=b1p2  + a1 q2
a3=b1q2 + a1 p2 + a1q2

그래서 p2=(pp+qq)q2=(qq+2pq)는 문제입니다.
위의 공식을 코드로 변환하여 제목을 작성한 프로세스 주체로 변환한 결과는 다음과 같습니다.
(define (fib-iter a b p q count)
  (cond ((= count 0) b)
	((even? count)
	 (fib-iter a
		   b
		   (+ (* p p) (* q q))
		   (+ (* q q) (* 2 q p))
		   (/ count 2)))
	(else (fib-iter (+ (* b q) (* a q) (* a p))
			 (+ (* b p) (* a q))
			 p
			 q
			 (- count 1)))))

좋은 웹페이지 즐겨찾기