먼저 몇 가지 참고 사항 :
(define f (lambda (x) l))
는
(define (f x) l))
당신은 그러나
(define board (lambda() (lambda (matrix) l)))
의 구분이 중요 동일하다
(define (board) (lambda (matrix) l))
로 결합하는 것과 동일 . 처음 두 가지는 필자가 하나의 매개 변수를 취하여 l을 반환하는 함수에 바인드 된 f를 나열했습니다. 나는 이것이 당신이 원하는 것을 추측하고 있습니다. 두 번째 두 가지 경우에는 매개 변수를 사용하지 않고 하나의 매개 변수, 행렬 (아무것도 사용하지 않는 것)을 사용하는 함수를 반환하고 l을 반환하는 함수에 보드를 바인딩합니다.
두 번째 문제 (list ((b w....) ...))
은 (b w ...)
을 (를) 평가하려고하기 때문에 작동하지 않습니다. 보드의 각 행에 대해 기능 응용 프로그램 위치에 목록이 있어야합니다 (예 : (list (list b w ...) (list w b ...) ...)
). 코드를 컴파일 할 때도 마찬가지입니다.
질문하고 있습니다. link-ref은 racket/base에 포함되어 있으며 목록에 색인을 알고있을 때 목록의 요소를 참조하는 데 사용됩니다.
(list-ref 2 (목록 'a'b 'c'd))
'c'가 반환됩니다. 색인은 0부터 시작합니다. 목록의 목록을 가지고 있으므로 'b'또는 w를 검색하려면 list-ref를 두 번 적용해야합니다.
변경 사항은 음, 할 수 없습니다. r6rs부터, (목록을 구성하는) 쌍은 불변이다. 가능하면 일을하는 것이 좋습니다. 변경 사항이있는 새 목록을 반환하는 것이 좋습니다. 이 다소 비효율적 인 list-set
버전을 사용하여 새 값이있는 목록의 복사본을 색인에 반환 할 수 있습니다. 그러나이 경우
(define (list-set lis idx val)
(map (lambda (e i)
(if (= i idx) val e))
lis
(iota (length lis))))
, 나는 당신이 아마 보드의 요소에 O (1) 접근을 원하기 때문에 현재 작업에 더 적절한 다른 데이터 구조로 전환에게 추천 할 것입니다.
vectors을 보면 목록과 매우 유사하지만 상시 조회 및 업데이트에 사용됩니다.
vector-ref
및
vector-set!
조작이 내장되어 있으며, 위의 기능 대신 사용해야합니다.
더 큰 문제의 일부이며 이미 모든 곳에서 목록을 사용하고 있다면 vector->list
및 list->vector
함수를 사용하여 앞뒤로 이동할 수 있습니다. 또한 mutable lists을 사용할 수 있지만 사용하지 마십시오.
srfi/25에 제공된 다차원 배열 라이브러리가 더 좋지만 얻을 수있는 것은 더 복잡 할 수 있습니다.
질문의 두 번째 부분은 보드를 재귀 적으로 만드는 방법이었습니다. 지도를 사용하는 버전이 있습니다.
(require (lib "1.ss" "srfi"))
(define (board)
(map (lambda (x)
(map (lambda (y)
(if (odd? (+ x y)) b w))
(iota 8)))
(iota 8)))
여기 재귀 버전
(define (board)
(letrec ((board-helper
(lambda (x)
(if (eq? x 8) '()
(cons (row-helper x 0) (board-helper (+ 1 x))))))
(row-helper
(lambda (x y)
(if (eq? y 8) '()
(cons (if (odd? (+ x y)) b w) (row-helper x (+ 1 y)))))))
(board-helper 0)))
감사입니다! 그게 내가 필요한 것, 두 버전,지도를 사용하는 것이 더 효율적입니까? 나는 코네 네 게임을 만들려고 노력하고있다. 이것은 보드 였고, 다음은 자동 컴퓨터 플레이어를 만들 것이다. 나는 계획에 관해 많은 지식을 가지고 있지 않으므로 다소 어려움이있다. 글쎄, 당신은 주로 문제를 해결하는 방법을 이해하는데 많은 도움을주었습니다. 다시 한번 감사 드리며 새해 복 많이 받으십시오! – gn66