2016-10-28 6 views
-1

두리스트의 교집합을 얻을 수있는 코드가 있습니다. 그러나 나는 목록에서 모든 중복을 제거하고 싶습니다. 나는 remove-duplicates() 함수를 사용한다. 내가 사용할 때마다 drRacket은 다음과 같은 에러를 낸다.스키마의 교차리스트에서 중복을 제거합니다.

응용 프로그램 : 절차 없음; (abccd) 인수 ... : 인수에 적용 할 수있는 절차 주어진 예상 [없음] 여기

이 내 코드를

#lang scheme 
(define (intersect lst1 lst2) 
    (removedup(lst1 lst2)) 
    (cond 
     ((null? lst1)(quote())) 
     ((isin? (car lst1) lst2) 
     (cons (car lst1) 
      (intersect (cdr lst1) lst2))) 
     (else (intersect (cdr lst1) lst2)))) 

(define (removedup lst1 lst2) 
    (remove-duplicates(lst1)) 
    (remove-duplicates(lst2)) 
) 

(define (isin? a lat) 
    (cond 
     ((null? lat) #f) 
     (else (or (equal? (car lat) a) 
       (isin? a (cdr lat)))))) 

내 입력 > (intersect '(a b c c d) '(c d e f))

입니다 아무도 내 문제를 해결할 수 있습니까? 미리 감사드립니다.

답변

5

다른 언어로 라켓에 온 것처럼 보입니다. Racket and Scheme에서는 여분의 괄호를 추가 할 수 없습니다. 각각의 괄호 쌍은 특정한 의미를 갖는다. 이 경우, 당신은

(remove-duplicates lst1) 

이 중 첫 번째는 두 가지 기능을 가지고 작성하는 것을 의미 할 때 호출

(remove-duplicates(lst1)) 

를 작성했습니다 : lst1를 호출 한 다음 호출은 제거 - 중복을 위해 함께 결과. lst1은 함수가 아니기 때문에 이들 중 첫 번째는 성공할 수 없습니다.

또한 DrRacket이 제공하는 분홍색 강조 표시를 살펴보십시오. 그것은 아마 문제 영역을 강조하고 있습니다.

또한이 버그를 수정하면 매우 유사한 또 다른 버그가 나타날 수 있습니다. 다음 줄에?

+0

감사합니다. 오류를 제거하도록 관리합니다. 그러나 나는 아직도 내가 원하는 결과를 얻지 못한다. 내 입력은> (교차 '(a b c c d)'(c d e f))입니다. 그리고 내 출력은 (c c d)입니다. 나는 내 결과물을 (c d) 원한다. – LvanRooij

+1

@LvanRooij Racket은 함수형 프로그래밍 언어이며 대부분의 함수는 가능한 경우 순수합니다. 'remove-duplicates'는 인수를 수정하지 않습니다 (사실, 목록은 Racket에서 불변입니다), 단순히 중복을 제거한 새로운 목록을 반환합니다. 반환 값을'remove-duplicates'로 감싸고, 부작용으로 호출하지 말아야합니다. –

+0

테스트 케이스가 핵심입니다. 또한 함수를 평가하는 방법을 잘 모르는 경우 스테퍼를 사용하여 직감을 구축하십시오. 프로그래머가되기 위해서는 무슨 일이 일어나고 있는지에 대한 가설을 세우고 테스트해야합니다. –