2010-02-16 1 views
-2

이 하나의 원자 lat 목록을 입력하고 lat 내용이 인 함수 내용을 설계하는 방법. 결과는 '(a b c a b c d d)'(a b c d)입니다.과제에 대한 숙제

+0

어떤 언어입니까? – Sarfraz

+2

@Sarfraz, 게시물의 제목은 "scheme on homework"입니다 ... –

+0

@ki, 지금까지 무엇을 시도 했습니까? 이미 시도한 것을 보여주지 않으면 도움이되지 않을 것입니다. –

답변

3

아래의 절차 content을 통해 필요한 것을 얻을 수 있습니다.

(define (work x y) 
    (if (null? (cdr x)) 
     (if (in? (car x) y) 
      y 
      (cons (car x) y)) 
     (if (in? (car x) y) 
      (work (cdr x) y) 
      (work (cdr x) (cons (car x) y))))) 

(define (in? x y) 
    (if (null? y) 
     #f 
     (if (equal? x (car y)) 
      #t 
      (in? x (cdr y))))) 

(define (content x) (work x (list))) 

절차 content는 매개 변수리스트를 받아 들인다. 목록을 work이라는 다른 프로 시저로 보냅니다. 이 프로시 저는 목록을 처리하고 목록의 항목을 새 목록에 추가합니다 (새 목록에없는 경우). work 절차는 항목이 목록의 구성원인지 확인하는 in이라는 또 다른 절차를 사용합니다.

내 솔루션은 본질적으로 두 가지 하위 문제로 문제를 나누고 원래 문제보다 낮은 추상화 수준에서 작동하는 절차를 사용합니다.

희망이 있습니다.

+2

@Eric - 정직하게 말하면, 코드 포맷팅은 begin/end 키워드를 추가하지 않고도 얻을 수있는 Lisp과는 다른 것입니다. http://stackoverflow.com/questions/541407/lisp-code-formatting을 참조하십시오. 예를 들어, – dsm

+0

그가 적대적인 것처럼 보인 이유는 숙제를 요청하는 사람에게이 코드를 제공했기 때문이라고 생각합니다. 나는 그의 선생님이 아마도 올바른 형식을 기대한다고 생각합니다. – Rayne

+1

그게 요점이야 ... 너에게 "적절하다"는 것은 내게 "적절하지"않을지도 모른다. – ecounysis

1

은 PLT 제도 솔루션입니다 :

(define (is_exists list element) 
(cond 
    [(empty? list) false] 
    [else 
    (cond 
     [(= (first list) element) true] 
     [else (is_exists (rest list) element)])])) 

(define (unique list target) 
    (cond 
    [(empty? list) target] 
    [else 
    (cond 
     [(is_exists target (first list)) (unique (rest list) target)] 
     [else (unique (rest list) (cons (first list) target))])])) 

(define (create_unique list) 
     (unique list empty)) 

을 확인 :

> (define my_list (cons '1 (cons '2 (cons '3 (cons '2 (cons '1 empty)))))) 
> my_list 
(list 1 2 3 2 1) 
> (create_unique my_list) 
(list 3 2 1) 
+3

else-clauses를 연결할 필요가없는'cond'의 요점이 아닌가?:-) – Ken

0

시작을 단순히 전달 된 목록 (아주 쉽게 할)의 복사본을 생성하는 과정에서 :

 
(define (unique-elements seq) 
    (define (loop ans rest) 
    (cond ((null? rest) ans) 
      (else 
      (loop (cons (car rest) ans) 
       (cdr rest))))) 
    (loop '() seq)) 

출력 목록의 요소가 고유하도록하려면 REST의 헤드가 이미 나와 있으면 CONS를 건너 뛰어야합니다. ANS의 mber. 그래서 우리는 그냥 그렇게 다른 조건을 추가 :

 
;;; Create list containing elements of SEQ, discarding duplicates. 
(define (unique-elements seq) 
    (define (loop ans rest) 
    (cond ((null? rest) ans) 
      ((member (car rest) ans) ; *new* 
      (loop ans (cdr rest))) ; *new* 
      (else 
      (loop (cons (car rest) ans) 
       (cdr rest))))) 
    (loop '() seq)) 
0

다음 함수는 목록에 취하고 인수가 재귀 사용하고 그것의 고유 한 입력을 새 목록을 반환

(defun uniq (list) 
    (labels ((next (lst new) 
       (if (null lst) 
        new 
        (if (member (car lst) new) 
         (next (cdr lst) new) 
         (next (cdr lst) (cons (car lst) new)))))) 
     (next list()))) 

으로 언급되었다 코멘트에, 커먼 리스프는 이미이 기능을 가지고있다 :

(defun uniq (list) 
    (remove-duplicates list)) 
+0

(defun uniq (list) (remove-duplicates list)) –

+0

하지만 그게 재미 있지? ;-) – dsm

+0

왜 -1 표가 있습니까? – dsm

0
 
(define (remove-duplicates aloc) 
    (cond 
    ((empty? aloc) '()) 
    (else (cons (first aloc) 
       (remove-duplicates 
       (filter (lambda (x) 
          (cond 
          ((eq? x (first aloc)) #f) 
          (else #t))) 
         (rest aloc))))))) 
1

어떻게 작은 모델명 : SCH에 대한 emer 스타일,

(define (rember-all a lat) 
    (cond 
    ((null? lat) '()) 
    ((eq? a (car lat)) (rember-all a (cdr lat))) 
    (else (cons (car lat) (rember-all a (cdr lat)))))) 

(define (content lat) 
    (cond 
    ((null? lat) '()) 
    (else (cons (car lat) 
       (content (rember-all (car lat) (cdr lat)))))))