두 개의 목록을 취하고 4 개의 목록을 반환하는 구성표 함수를 작성하는 방법
문제
요소 '(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 ...
물론 가능합니다. 다음은 몇 가지 힌트입니다.
- 목록과 빈 목록을 결합한 결과는 무엇입니까?
- 한 번에 모두 할 필요는 없습니다. 한 번에 한 조각을 가져 가십시오.
제휴하지 않습니다 StackOverflow