cons
에는 2 개의 셀이 있습니다. car
및 cdr
. 셀은 (a . b)
으로 표시 될 수 있습니다. 여기서 a
및 b
은 어떤 것이 될 수 있습니다.
쌍으로 표시되는 대체 표현이 있습니다. b
이 다른 쌍이거나 빈 목록 인 경우 . b)
을 b
으로 바꿀 수 있습니다.이 경우 (
이 붙지 않습니다. 따라서 :
(a .()) ; ==> (a)
(a . (b . c)) ; ==> (a b . c)
(a . (b . (c .()))) ; ==> (a b c)
이제 코드를 작성하십시오. (1 2 3 4)
(또는 정확하게는 (1 . (2 . (3 . (4 .()))))
)을 사용해보십시오. substitution rules을 사용하여 귀하의 절차가 정확히 무엇인지 계산합니다 :
(reverse-list '(1 . (2 . (3 . (4 .()))))) ; ==>
(if (empty? '(1 . (2 . (3 . (4 .())))))
empty
(cons (reverse-list (rest '(1 . (2 . (3 . (4 .()))))))
(cons (first '(1 . (2 . (3 . (4 .())))))
empty))) ; ==>
(if #f
empty
(cons (reverse-list (rest '(1 . (2 . (3 . (4 .()))))))
(cons (first '(1 . (2 . (3 . (4 .())))))
empty))) ; ==>
(cons (reverse-list '(2 . (3 . (4 .()))))
(cons 1 empty)) ; ==>
(cons (cons (reverse-list '(3 . (4 .())))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (reverse-list '(4 .()))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (cons (reverse-list '())
(cons 4 empty))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (cons '()
(cons 4 empty))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
((((() . (4 .())) . (3 .())) . (2 .())) . (1 .())) ; ==>
((((() . (4)) . (3)) . (2)) . (1)) ; ==>
((((() 4) 3) 2) 1)
Now. 사실 반전 된 목록은 점으로 구분 된 표기법으로 다음과 같이 보입니다.
(4 . (3 . (2 . (1 .())))) ; ==> (4 3 2 1)
주위를 둘러 볼 방법이 없습니다. cons
과 매우 친밀 해져야하며 다양한 구성 방법이 표시되는 방법을 알고 있어야합니다. 힌트는 거의 모든 목록이 처음부터 끝까지 만들어지고 처음부터 끝까지 반복된다는 것입니다.
그래서 난 정말 당신이 무슨 말을하는지받지 못했습니다. 그것은 "빈"과 관련이있는 것처럼 보입니다. 그러나 drracket이 그것 없이는 나에게 단념시키지 않을 것이기 때문에 그것을 넣습니다. – Acoustic77
"빈"이 문제가 아니며 "단점"을 사용합니다. 단점은 항목과 목록의 두 가지를 취합니다. '(cons 1 '(2 3 4))'는 (1 2 3 4)'를줍니다. 당신은 단점의 사용법으로 전체 목록 *을 첫 번째 위치에 넣습니다. '(cons (1 2) '(3 4))'=>''((1 2) 3 4)'그래서 이상한 중첩을 얻는다. Sylwester가 말한 것은''왜''가 무엇을하는지, 어떻게 사용하는지, 그리고 빈리스트에 항목을 하나씩 추가하여리스트가 만들어져 코드가 잘못된 것을 이해하는 것입니다. – Jack