「Scheme 입문」(유아사 타이치 저: 이와나미 서점 1991년)를 Gauche에서 읽는다(2)
전자
(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. 노망과 재료가 부족하기 때문에 나중에 편집하고 싶습니다.
Reference
이 문제에 관하여(「Scheme 입문」(유아사 타이치 저: 이와나미 서점 1991년)를 Gauche에서 읽는다(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tochu-cha/items/ce00b4970e5a8501c077텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)