2014-09-22 3 views
1

값을 전송하는 곳에서 함수를 수행하고 제거 할 값이 동일한 경우 목록에서 체크해야합니다. 다음은 몇 가지 예는 다음과 같습니다SCHEME 목록에서 원자 값을 제거하십시오.

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))   => (a() c) 
(elimina 1 '(0 (1 (2) 1) 0)) => (0 ((2)) 0) 

나는이 시도 : 어떤 이유로

(elimina 1 '(a b c))   => (a b c) 
(elimina 'b '(a (b) c))  => (a()) 
(elimina 1 '(0 (1 (2) 1) 0) => (0 ((2))) 

목록의 마지막 값이 표시되어 있지 않을 경우이 같은 곳

(define (elimina v1 lista) 
    (cond ((null? lista)'()) 

     ((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

     (else 
     (if(equal? v1 (first lista)) 
      (elimina v1 (cdr lista)) 
      (append (cons (first lista) (elimina v1 (cdr lista)))))) 
    ) 
) 

그리고 내 결과를 . 누군가가 도울 수 있기를 바랍니다.

감사합니다.

답변

0

1) 귀하의 문제는 여기에 있습니다 : 당신이 하위리스트에 재귀 때

((list? (first lista)) 
     (list (elimina v1 (first lista)))) 

, 당신은 더 이상 목록의 나머지 부분을 처리하지 않습니다. 또한

2), 당신은 그래서 그냥 append 드롭, 아무것도 목록을 추가하고 있기 때문에

(append (cons (first lista) (elimina v1 (cdr lista)))))) 

이 단순화 될 수있다.

3) 아니 오류,하지만 난 당신이 중 하나first, second, rest ... 또는car, cadr, cdr 사용하는 것이 좋습니다 ...

시도 :

(define (elimina v1 lista) 
    (cond 
    ((null? lista) '()) 
    ((list? (first lista)) 
    (cons (elimina v1 (first lista)) (elimina v1 (rest lista)))) ; <= (1) 
    (else 
    (if (equal? v1 (first lista)) 
     (elimina v1 (rest lista)) 
     (cons (first lista) (elimina v1 (rest lista)))))))  ; <= (2) 
+0

감사 흠뻑! –

관련 문제