2014-10-21 1 views
-1
으로 목록을 분할

문제점 :반응식 - 동일한 두리스트

함수 (분할 L)를 작성 개의 동일한 크기 (하나에) 목록으로 목록 및 파티션을 취하고, 그 차가있는 쌍을 반환 첫 번째 목록과 그 cdr 두 번째 목록입니다.

내 코드 :

(define split list) 
    (let ((half (/ (length list) 2) 
    (cons (car half list) 
      (cdr half list)))) 
+0

나는 코드가 실제로 시도로 간주되지 않는다고 생각합니다. 그것은 문법적으로 정확하지 않고, 실행되었다하더라도 실행되지 않습니다. 'car'는 두 가지가 아니라 하나의 인수를 취합니다. –

답변

6

다음은 tortoise and hare 알고리즘을 사용하여 다른 가능한 구현이다 쪼개다. "거북이와 토끼"라고 불리는 이유는 목록에 두 가지 포인터가 있습니다. 한 번에 한 요소 ("거북이")와 한 번에 두 요소 ("토끼")가 더 빨리 진행됩니다. hare가 입력 목록의 끝에 도달하면 알고리즘이 중지됩니다.

또는 내장 프로 시저를 사용하여보다 관용적 인 (느리지 만) 솔루션을 구현할 수 있습니다. takedrop 절차 (안 경우, SRFI-1에서 가져 오기), 이것은 당신이 생각했던 것과 가까운 당신의 통역에서 사용할 수 있다고 가정 :

(define (split lst) 
    (let ((half (quotient (length lst) 2))) 
    (cons (take lst half) 
      (drop lst half)))) 

어느 쪽이든, 그것은 예상대로 작동합니다

(split '(1 2 3 4)) 
=> ((1 2) 3 4) 

(split '(1 2 3 4 5)) 
=> ((1 2) 3 4 5) 
+1

아주 멋진 솔루션입니다. –

+0

하지만 take 및 drop을 지정하지 않으면 가져올 수 없으므로 코드를 작성하는 방법은 무엇입니까? – user64532

+0

@ user27 그런 다음 첫 번째 버전의 코드를 사용하거나 자신의 버전 인'take' 및'drop'을 구현하십시오. 그렇게 어렵지는 않습니다 (링크 된 문서에서 그들이해야 할 일에 대한 아이디어를 얻으십시오). SRFI-1의 [소스 코드] 가이드 (https://github.com/bnoordhuis/chicken-core/blob/master/srfi-1.scm)로 사용하십시오. –

0

시도 :이 도움이

(split '(1 2 3 4)) => ((1 2) 3 4) 
(split '(1 2 3 4 5)) => ((1 2) 3 4 5) 

희망을 다음과 같이

(define (splitAt n lst) 
    (let loop ((acc '()) (n n) (lst lst)) 
     (if (or (= n 0) (null? lst)) (cons (reverse acc) lst) 
      (loop (cons (car lst) acc) (- n 1) (cdr lst))))) 

(define (split lst) (splitAt (quotient (length lst) 2) lst)) 

의미가 있습니다.

(define (split lst) 
    (let loop ((tortoise lst) (hare lst) (acc '())) 
    (if (or (null? hare) (null? (cdr hare))) 
     (cons (reverse acc) tortoise) 
     (loop (cdr tortoise) 
       (cddr hare) 
       (cons (car tortoise) acc))))) 

위의 솔루션은 목록 한 번만 , 우리가리스트의 길이를 알 필요가 없습니다 통지를 통과하는 장점이 있습니다 :

+0

'list' 매개 변수의 이름을 지정하는 것은 좋지 않습니다. 내장 된'list' 프로 시저와 충돌합니다. –

+0

내장 된'list' 프로 시저를 전혀 사용하지 않기 때문에 중요하지 않습니다. –

+2

@AaditMShah 나쁜 습관이 중요합니다. 그들은 조만간 당신을 물 것입니다. – uselpa