2014-12-28 2 views
0

중복을 제거하기 위해이 코드를 작성 했으므로 작동합니다. 그러나 동등한 기능을위한 옵션을 추가 할 때 문제가 있습니다. 내가 무엇을 할 수 있을지?? 감사합니다.스킴 : 코드에 무슨 문제가 있습니까?

(define (remove-dups ls eq) 
    (if (null? ls) '() 
     (cons (car ls) (remove-dups (deepRemove (car ls) (cdr ls) eq))))) 

(define (deepRemove n L eq) 
    (if (null? L) '() 
    (if (list? (car L)) 
     (cons (deepRemove n (car L) eq) (deepRemove n (cdr L) eq)) 
     (if (eq? n (car L))(deepRemove n (cdr L) eq) 
      (cons (car L)(deepRemove n (cdr L) eq)))))) 
+1

어떤 문제가 예상대로 작동하지 않습니까? 문제를 설명 할 때 가능한 한 명확하게 기재하십시오. – EWit

+2

'deepRemove'에 전달 된 술어 ('eq')를 호출하지 않습니다 ('if'는 내장'eq?'를 사용합니다). – Dirk

+0

무엇을 바꾸어야합니까? –

답변

2

코드에 두 가지 오류가 있습니다. 먼저, 잘못된 숫자의 인수를 remove-dups에 전달합니다. 둘째로 에 실제로 eq 매개 변수를 사용하고 있지 않습니다. 또한 if을 중첩하는 대신 cond을 사용해야하지만 스타일이 더 중요합니다. 이 시도 :

(define (remove-dups ls eq) 
    (if (null? ls) 
     '() 
     (cons (car ls) 
      (remove-dups (deepRemove (car ls) (cdr ls) eq) eq)))) ; fixed 

(define (deepRemove n L eq) 
    (if (null? L) 
     '() 
     (if (list? (car L)) 
      (cons (deepRemove n (car L) eq) 
       (deepRemove n (cdr L) eq)) 
      (if (eq n (car L)) ; fixed 
       (deepRemove n (cdr L) eq) 
       (cons (car L) 
        (deepRemove n (cdr L) eq)))))) 

위는만큼 당신이 고려 비교하는 데 필요한 모든 가능한 값을 취 적절한 eq 절차를 통과 작동, 그 조심.

관련 문제