2016-09-05 1 views
0

내가 SICP 책을 사용하고 내가이 연습 한과 코드 개선 :SICP - 더 추상화

1.11 함수 f를이 규칙 F (n)에 의해 정의된다 = N 경우 N < 3, F (n> 3이면 f (n-1) + f (n-2) + 3f (n-3)이됩니다. 반복적 인 프로세스를 통해 f를 계산하는 프로 시저를 작성하십시오.

재귀 프로세스가 쉽습니다. 반복적 인 것이 더 어렵습니다.

(define (f-ltail n) 
    (f-iter 0 n)) 

(define (f-iter produto n) 
    (define counter (- n 2)) 
    (cond ((< n 3) n) 
     ((= counter 0) produto) 
     (else (+ produto (+ (f-iter produto (- n 1)) 
          (* 2 (f-iter produto (- n 2))) 
          (* 3 (f-iter produto (- n 3)))))))) 

내 교수는 우리가 정의 할 필요가 없습니다 일을 정의하지 않도록해야한다는 말을 계속 :

는이 코드를했다.

이 정의가 실제로 필요합니까?

(define counter (- n 2)) 

그렇지 않은 경우 어떻게하면이 코드를 제거 할 수 있습니까?

+0

내 게시물이 왜 downvoted 되었습니까? 나는 스택 오버플로가 새로 생겨서 그것을 이해할 수 없었습니다 ... –

+1

'counter ='한 자리를 사용하고 있기 때문에'(= (- n 2) 0)'을 보았습니다. '(= n 2)'첫 번째 용어가 '3'보다 적은 모든 것에 도달하기 때문에'n'은'3' 이상이므로'n'은 두 번째 용어에서'2'가 될 수 없다는 것을 알고 있습니다. 반복적 인 프로세스는 꼬리 재귀적일 것이므로 모든 계산은 인수에 있어야합니다. – Sylwester

+0

'f-iter'가 반복적 인 프로세스를 생성하지 않는다는 사실부터 시작해 봅시다. 즉, tail-call 위치에 있어야합니다. 실제로 선형 반복적 프로세스 여야하지만 프로 시저가 트리 재귀를 발생시킵니다. SICP에서 피보나치 예제를 살펴보고 코드에서와 같은 방식으로 코드를 수정하십시오. – mobiuseng

답변

0

피보나치 시퀀스가 ​​반복적으로 계산되는 책 gives an example. 대신 fib-iter 함수 내부 카운터 변수를 정의하는 매개 변수는 그 값을 추적하는 기능으로 전달된다

(define (fib n) 
    (fib-iter 1 0 n)) 

(define (fib-iter a b count) 
    (if (= count 0) 
     b 
     (fib-iter (+ a b) a (- count 1)))) 

참고. 당신은 당신의 기능에서 동일한 패턴을 따를 수 있습니다.