2013-02-09 3 views
3

피보나치 재귀의 트리 재귀 구현과 같은 함수가 주어지면 (fib 5)과 같은 표현식 평가에서 각 단계를 어떻게 표시 할 수 있습니까?스킴 확장 프로 시저 호출

(fib 5) 

(+ (fib 4) (fib 3)) 

(+ (+ (fib 3) (fib 2)) (+ (fib 2) (fib 1))) 

(+ (+ (+ (+ (fib 1) 0) (fib 1) (+ (fib 1) 0)) (+ (+ (fib 1) 0) (fib 1))) 

(+ (+ (+ (+ 1 0) 1 (+ 1 0)) (+ (+ 1 0) 1)) 

내가 quasiquoting를 사용하여, 당신은 부분적으로 식을 계산할 수 있다는 것을 알고, 같이 :

(define (fib n) 
    (cond ((= n 0) 0) 
     ((= n 1) 1) 
     (else (+ (fib (- n 1) 
       (fib (- n 2)))))) 

예를 들어, 내가 출력 싶습니다 그러나

`(+ ,(* 3 4) (- 0.1 2)) ; evaluates to -┐ 
(+ 12 (- 0.1 2))   ;   <----┘ 

을, 내가 가진 이 단계를 사용하여 평가의 각 단계를 보여주지 못했습니다. 나는 Peter Norvig의 lis.py과 같은 스킴 인터프리터를 수정할 수 있다는 것을 알고 있지만, 언어 자체 내에서이를 수행하는 방법을 원합니다. 어떻게해야합니까?

답변

5

너는 그런 뜻이야? 예를 들어

(define (fib n) 
    (cond ((= n 0) 0) 
     ((= n 1) 1) 
     (else `(+ ,(fib (- n 1)) 
        ,(fib (- n 2)))))) 

: 물론

(fib 5) 
=> '(+ (+ (+ (+ 1 0) 1) (+ 1 0)) (+ (+ 1 0) 1)) 

, 위에서 언급 한 평가 만 최종 결과를 반환합니다. Racket과 같은 내장 스테퍼를 사용하여 각 중간 단계를 볼 수 있습니다. 약간의 방법을 보려면 answer을보고 피보나치 함수를 표시합니다.

+0

아, 나는 잘못 된 장소에서 쿼시 콰이어하고 있었고, 나는 그 것을 프로 시저 몸체 밖에서 계속 사용했다. 고맙습니다! – tlehman

+0

@TobiLehman 내 기쁨! –

+0

나는 라켓을 조사해야 할 것입니다. 매우 시원합니다. 내가하고 싶은 것은 SICP 68 페이지와 같은 트리 시각화를 생성하는 것입니다. GraphViz를 사용하면 "(fib 3) -> (fib 2)", "(fib 3) -> (fib 1)"과 같은 부모 - 자식 쌍을 출력하고'dot '을 사용하여 그것을 PNG로 렌더링하십시오. 각 함수 호출을 (begin (display ..)) 문으로 래핑 할 수 있습니다. – tlehman