두 개의 목록을 취하고 4 개의 목록을 반환하는 구성표 함수를 작성하는 방법

StackOverflow https://stackoverflow.com/questions/765484

  •  12-09-2019
  •  | 
  •  

문제

요소 '(ABC)'(DBF)의 2 개 목록이 있으며 한 결과에서 차이점, 노조 및 교차점을 찾고 싶습니다. 그게 가능합니까? 어떻게?

두 번째 목록에 첫 번째 목록의 자동차가 있는지 확인하는 멤버 기능을 작성했지만 멤버를 새 목록에 던질 수는 없습니다.

(define (checkResult lis1 lis2)
  (cond...........

))
(checkresult '( a b c) '(d b f))

내 결과가되어야합니다 (( a c) (d f) (a b c d f) (b)).

도움이 되었습니까?

해결책

다른 사람들이 말했듯이, 당신이해야 할 일은 두 세트의 교차로, 노조 및 뺄셈을 계산하기 위해 별도의 기능을 만들고, checkresult에서 호출하기 만하면됩니다.

(define (checkresult a b)
  (list (subtract a b)
        (subtract b a)
        (union a b)
        (intersect a b)))

다음은 몇 가지 예제 조합, 교차 및 뺄셈 기능입니다.

(define (element? x lst)
  (cond ((null? lst) #f)
        ((eq? x (car lst)) #t)
        (#t (element? x (cdr lst)))))

(define (union a b)
  (cond ((null? b) a)
        ((element? (car b) a)
         (union a (cdr b)))
        (#t (union (cons (car b) a) (cdr b)))))

(define (intersect a b)
  (if (null? a) '()
      (let ((included (element? (car a) b)))
        (if (null? (cdr a))
            (if included a '())
            (if included
                (cons (car a) (intersect (cdr a) b))
                (intersect (cdr a) b))))))

(define (subtract a b)
  (cond ((null? a) '())
        ((element? (car a) b)
         (subtract (cdr a) b))
        (#t (cons (car a) (subtract (cdr a) b)))))

참고 : 이들은 세트이며 순서는 중요하지 않으므로 결과는 정렬되지 않습니다. 또한 함수는 입력이 세트라고 가정하므로 노조에 필요한 것 이상의 중복 점검을 수행하지 않습니다.

다른 팁

물론 가능합니다. 차이점, 노조 교차 등을 계산할 기능이 있다고 가정합니다.

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...

물론 가능합니다. 다음은 몇 가지 힌트입니다.

  1. 목록과 빈 목록을 결합한 결과는 무엇입니까?
  2. 한 번에 모두 할 필요는 없습니다. 한 번에 한 조각을 가져 가십시오.

Charlie Martin과 Tomjen의 답변 외에 나는이 출처를 생각해 냈습니다.

노동 조합 교차 및 차이

고유 한 기능의 구현은 좋은 설명으로 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top