「Scheme 입문」(유아사 타이치 저: 이와나미 서점 1991년)를 Gauche에서 읽는다(2)

2143 단어 SchemelispGauche
P114의 [5.3.6]의 "게임 나무"의 해답은 P123과 P124에 두 가지 있다.
전자
(define (nim n)
  (case n
    ((0) (list 0))
    ((1) (list 1 (nim 0)))
    ((2) (list 2 (nim 1) (nim 0)))
    (else (list n
        (nim (- n 1))
        (nim (- n 2))
        (nim (- n 3))
        )
      )
    )
)

(「Scheme 입문」P123에서 인용)
예를 들어
(nim 4)

평가하면
gosh> (4 (3 (2 (1 (0)) (0)) (1 (0)) (0)) (2 (1 (0)) (0)) (1 (0)))
*書き直すと

(4 (3 (2 (1 (0)) 
     (0))
      (1 (0))
      (0))
   (2 (1 (0))
      (0))
   (1 (0)))
*こう。

돌아오지만

P124의보다 효율적인 코드
(define (nim2 n)
  (case n
    ((0) (list 0))
    ((1) (list 1 (nim2 0)))
    ((2) (list 2 (nim2 1) (nim2 0)))
    (else (let ((x (nim2 (- n 1))))
        (list n
          x
          (cadr x)
          (caddr x))
        )
      )
    )
)

하면 (단 nim을 nim2로 다시 쓰고 인용)

gosh> (4 (3 #0=(2 #1=(1 (0)) #2=(0)) #1# #2#) #0# #1#)

그리고 돌아온다.

마지막 (1.5) 에서 언급했듯이, Gauche는 동일한 객체를 사용합니다 (말 나쁘지 않은 경우).
#
를 사용하여 중복을 피하기 때문에 위의 목록은

gosh> (4 (3 (2 (1 (0)) (0)) (1 (0)) (0)) (2 (1 (0)) (0)) (1 (0)))

와 동일하다.

시험에
(define y
'(3 (2 (1 (0)) 
     (0))
      (1 (0))
      (0))
)

그리고 목록을 만든 후 (목록을 만들거나 목록을 인용 한 후)
(list (+ (car y) 1)
      y
      (cadr y)
      (caddr y)
)

그렇듯이
gosh> (4 (3 #0=(2 (1 (0)) (0)) #1=(1 (0)) (0)) #0# #1#)
그리고 돌아옵니다.

그림으로 표현하면



그래서 결과



와 같은 일이 되는 것입니다.

PS. 노망과 재료가 부족하기 때문에 나중에 편집하고 싶습니다.

좋은 웹페이지 즐겨찾기