Zmodyfikowałem kod funkcji count-change
w SICP, tak aby wyświetlał parę, gdy funkcja się powtarza. Ta para ma postać "(cc a k)" -> "(cc a (- k 1))"
lub "(cc a k)" -> "(cc (- a (d k)) k)"
, moim celem jest stworzenie pliku DOT do wyświetlenia rekursji drzewa za pomocą GraphViz.Sposób korzystania z makr programu do wyświetlania drzewa oceny
Oto przykład obraz uzyskany z poniższego kodu:
Oto kod programu:
; Count Change
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(begin
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+
(begin
(display "\"")
(display `(cc ,amount ,kinds-of-coins))
(display "\"")
(display " -> ")
(display "\"")
(display `(cc ,amount ,(- kinds-of-coins 1)))
(display "\"")
(display "\n")
(cc amount (- kinds-of-coins 1))
)
(begin
(display "\"")
(display `(cc ,amount ,kinds-of-coins))
(display "\"")
(display " -> ")
(display "\"")
(display `(cc ,(- amount (first-denomination kinds-of-coins)) ,kinds-of-coins))
(display "\"")
(display "\n")
(cc (- amount (first-denomination kinds-of-coins)) kinds-of-coins)
)
)
))))
; first-denomination takes the number of kinds of coins and returns the denomination of the first kind
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
(count-change 11)
Oryginalny kod jest here.
Przeczytałem o makrach programów i myślę, że mogliby rozwiązać ten problem, pozwalając mi na "zawijanie" wywołań do (cc..) W oświadczeniu begin
z wyświetlaczami, aby wyprowadzić to, co dzieje się w czasie rekursji .
Jak można tego dokonać za pomocą makr schematu?
UWAGA: Wiem, że mój obraz jest niedokładny, muszę znaleźć sposób na odróżnienie węzłów, aby wykres był drzewem, a nie tylko DAG. Jest to jednak poza zakresem tego pytania.
Dla realizacji używam MIT/program GNU. To jest trochę ładniejsze niż to, co mam, lubię to, że druk jest w jego własnej funkcji. Właściwie można to uogólnić, aby 'cc' było funkcją ogólną, w ten sposób mogę ponownie użyć go na innych funkcjach! – tlehman
Nie korzystałem z funkcji lokalnej, ale zrobiłem coś podobnego do tego, co sugerowałeś [tutaj] (https://github.com/tlehman/sicp-exercises/blob/master/count-change-verbose.scm) . Pracuję nad uniezależnieniem go od arii tej funkcji. – tlehman
Usunąłem ten problem, używając etykiet dla węzła, który koduje ich lokalizację, więc 'rrllr' idzie w prawo, w prawo, w lewo, w lewo, a potem w prawo. [Szczegóły i zdjęcia tutaj] (http://tobilehman.com/blog/2013/04/07/visualization-of-sicp-exercise-1-dot-14/) – tlehman