2013-12-07 11 views
-1

제 문제는 바로 그것입니다. 나는 다른 목록 (lst)에서 임의의 요소를 포함하는 하위 목록 (slst1) 있습니다. 그런 다음 slst1이 아닌 lst 요소를 포함하는 또 다른 요소 (slst2)를 만들어야하지만, 그 요소를 비교할 때 결과는 예상과 다릅니다.두 목록의 요소를 비교하고 다른 요소를 추가하십시오.

호출이 될 것입니다 :

'0.3'그것이 내가 먹고 싶어리스트의 비율입니다
(split 0.3 lst) 

. 예를 들어, slst1는 포함

((a11 a12 a13 a14)(a21 a22 a32 a42) (a31 a32 a33 a34)) 

과 :

((a11 a12 a13 a14) (a31 a32 a33 a34)) 

을하지만, 내 코드와 함께, slst2에는 다음이 포함

((a21 a22 a23 a24)) 

, slst2이 포함되어 있어야합니다

LST는 포함 항상 다른 것들뿐 아니라 항상 동일한 아이템. 내가 지금 어떤 조언이 완벽 할 것, 라켓에서 noobie 해요

(define (split proportion lst) 
(let((ne (* proportion (length lst)))(slst1 '())(slst2 '())) 
;Calculate first sublist 
(when (> ne 0) 
    (for ([i (inexact->exact ne)]) 
    (if (null? lst) 
     (set! slst1 (list-ref lst (random (length lst)))) 
     (set! slst1 (list lst (list-ref lst (random (length lst))))))) 
;Try to calculate second sublist 
    (for ([i (length lst)] 
    #:when (not(member (list-ref lst i) slst1))) 
    (set! slst2 (list slst2 (list-ref lst i))) 
    ) 
slst2))) 

:

이 내 코드입니다. 읽어 주셔서 감사합니다/부탁드립니다. 내가 제대로 이해하면

+1

'split'을 호출하는 방법, 얻은 결과 및 예상되는 결과의 예를 보여줄 수 있습니까? – uselpa

+0

'split'을 위해 올린 코드는 옳지 않습니다. 괄호가 없기 때문에 컴파일되지 않습니다. –

+0

Joshua Taylor, 저, 라켓 박사님, 저는 합법적이라고 말해야합니다. 따라서 복사하여 붙여 넣으십시오. uselpa : 아침에 나는 예를 들어, 전화와 결과를 예상했다. 나쁜 질문에 대해 유감입니다. 그것은 내 첫 번째 ^^ '' –

답변

0

이 할 것입니다 : 다음

(define (split proportion lst) 
    (define le (length lst)) 
    (define slst1 
    (for/list ([i (inexact->exact (round (* proportion le)))]) 
     (list-ref lst (random le)))) 
    (define slst2 
    (for/list ([e (in-list lst)] #:unless (member e slst1)) 
     e)) 
    (values slst1 slst2)) 

slst1, 그래서 (길이 slst1를) 두 번 이상 같은 멤버 더 포함 할 수
(split 0.5 '((a11 a12 a13 a14)(a21 a22 a32 a42) (a31 a32 a33 a34) (a41 a42 a43 a44))) 
=> '((a11 a12 a13 a14) (a21 a22 a32 a42)) 
    '((a31 a32 a33 a34) (a41 a42 a43 a44)) 

주 + (길이 slst2)는 (길이 lst)보다 클 수 있습니다. 또한 회원이 초기 목록에 두 번 이상 나타나면 이상한 결과를 얻을 수 있습니다. 이러한 문제가 발생하지 않도록하려면

, 다음에 갈 수 :

(define (split prop lst) 
    (for/fold ((s1 '()) (s2 lst)) ([i (inexact->exact (round (* (length lst) prop)))]) 
    (define rn (random (length s2))) 
    (values 
    (cons (list-ref s2 rn) s1) 
    (append (take s2 rn) (drop s2 (add1 rn)))))) 

S1은 LST S2로, null로 초기화됩니다. s1에 요소를 추가 할 때마다 s2에서 요소를 제거합니다.

+0

"-1 종료"란 무엇을 의미합니까? – uselpa

+0

내 질문을 편집합니다. 이 작동하지만 기능을 mantein (take-random lst)합니다. 어쨌든, 나는 그것을 적응시킬 수 있다고 생각한다. 다른 조언? 왜 대신/fold를 사용해야합니까? 뭐가 달라? –

+0

당신의 take-random 정의는 무엇입니까? 코드를 게시 할 수 있습니까? – uselpa

관련 문제