2011-03-10 8 views
0

재귀를 사용하여 목록에서 중복을 제거하려고합니다. 이것이 내가 가진 것입니다. 첫 번째 복제본 만 제거하고 전체 복제본은 제거하지 않습니다.스키마의 목록에서 모든 중복 멤버 제거

제 생각에는 첫 번째 멤버를 살펴보고 나머지 구성원의 구성원이 해당 함수를 다시 호출하는지 확인하십시오. 그렇지 않은 경우 첫 x 째 bv와 함수를 다시 호출 한 결과로 목록을 작성하십시오. 나는 그것이 왜 모든 중복을 제거하지 않는지 이해할 수 없다.

(define (removeDupes L) 
    (cond ((null? L)()) 
     ((list? (member (car L) (cdr L))) removeDupes (cdr L)) 
     (#T (cons ((car L) (removeDupes (cdr L))))))) 

이것은 내가 수정 한 것입니다. 그리고 나는 죄수들에게 무엇이 잘못된 것인지 이해합니다. 그것은 두 개의 매개 변수를 필요로하고 나는 그것만을 주었다. 나는 아직도 세 번째 줄이 작동하지 않은 이유를 모른다 ....이없는

(define (removeDupes L) 
    (cond ((null? L)()) 
     ((list? (member (car L) (cdr L)))(removeDupes(cdr L))) 
     (#T (cons (car L) (removeDupes (cdr L)))))) 

답변

3

이 코드에서 여러 오류가 있지만, 아마 당신이 여기에보고 한 문제를 일으키는 일이 괄호가 잘못이다 세 번째 줄에. removeDupes에 전화하려고하는데 코드가 실제로 그렇게하지 않습니다. 대신에 그 값은 (cdr L)이됩니다. 왜 볼 수 있니?

이 문제를 해결하면 코드에서 오류가 발생하기 시작합니다. 첫 번째로 발생할 가능성이있는 경우 : 마지막 줄에 cons을 어떻게 호출하는지주의 깊게 살펴보십시오. 다음에 발생할 가능성이있는 경우 : ()은 Scheme에서 자체 평가되지 않습니다.

(나는 이런 종류의 일은 코드의 간격과 레이아웃에주의를 기울이지 않으면 놓치기가 훨씬 더 어렵다고 생각합니다. 예를 들어 모든 목록의 요소 사이에 공백을 넣으십시오. 이러한 오류가 발생하는 것을 막을 수 있습니다. 신비한 오류를 겪을 때마다 괄호를 확인하는 습관을 갖고 싶을 것입니다. 표현의 시작 부분에 (을 놓치거나 함수의 인수 앞에 여분의 (을 넣었거나 cond 절, 또는 기타 등등의 괄호의 추가 수준을 잊어 버렸습니다. 걱정하지 마십시오. 잠시 후 ...)

+0

서식을 고정했지만 형식은 고정되어 있습니다. 물론 가짜 인 것들. :-) –

+1

편집 : 나는 어떤 종류의 Lisp와 Scheme 코딩을하기 위해서 [Paredit] (http://mumble.net/~campbell/emacs/paredit.html)을 강력히 추천한다. 브래킷은 항상 다른 모든 유용한 기능과 항상 균형을 유지합니다. –

+2

OK, 모든 버그를 수정했습니다. 그것은 당신이 왜 그것이 도움이되었는지 전혀 모른다는 것에 약간의 걱정입니다! 아마도 당신은 다음과 같은 매우 중요한 것을 놓치고 있습니다. Scheme의 괄호는 수학에서 괄호와 같은 역할을 수행하지 않습니다. '((x))'는 원격으로'(x)'와 똑같은 것이 아니며'x'와는 같은 것이 아닙니다. 일반적으로 Scheme 코드에서'(a b c d)'는 다음과 같은 것을 의미합니다 :'b','c', d'를 인자로하여'a' 함수를 호출하십시오. 이것을'((a b c d))'또는'(a (b c) d)'또는 무엇인가로 바꾸면 의미가 완전히 다릅니다. –