2013-10-30 4 views
0

중첩 목록에서 문자열을 제거하는 프로 시저를 작성하고 있습니다. 예 :중첩 목록의 각 요소 간 이동

(define fubar '(("a" -1 7) (2 "c") ("d") (-2))) 
(remove strings fubar) should return '((-1 7) (2)() (-2)). 

당신은 단순히 cdr 목록이 중첩되기 때문에 다운 목록, 개별적으로 순서대로 각 목록의 모든 요소를 ​​선택하고 문자열이 있는지 확인하는 방법이 필요 할 수 있기 때문에. 그 일을하는 법에 대한 아이디어가 있습니까? 차

(define (remove-strings fubar) 
(cond ((null? fubar) ...) 
     ((pair? (car fubar)) 
     (cons (... (car fubar)) (... (cdr fubar)) 
     (else ...))) 

답변

2

이 목록의 목록을 통과하기위한 솔루션은 다음 목록 자체를 경우

0

여기 시작하는 골격, 트리 재귀의 트릭은 자동차와 CDR에 RECUR입니다입니다 잘 알려진 솔루션의 템플릿을 사용하면 일반 구조를 제공하므로 공백을 채울 수 있습니다. 솔루션을 직접 찾으면 훨씬 나아질 것입니다. 그것은 우리가 요소를 유지 한 후 문자열이 아니라면 (*)에서 우리는 다음 줄에 우리는 단순히 새로운 목록을 구성하는 과정에서 그들을 무시 찾을 모든 문자열을 "삭제"하고 있다는 것을

(define (remove-strings lst) 
    (cond (<???> <???>) ; if the list is empty, return the empty list 
     ((not (pair? <???>)) ; if the current element is not a list 
     (if (string? <???>) ; if the current element is a string 
      (remove-strings <???>) ; simply advance recursion over cdr (*) 
      (cons <???>     ; else keep the current element 
        (remove-strings <???>)))) ; advance recursion over cdr 
     (else       ; otherwise it's a list of lists 
     (cons (remove-strings <???>)  ; advance recursion over car 
       (remove-strings <???>))))) ; advance recursion over cdr 

공지 사항 출력 목록을 작성하는 동안. 위의 내용은 임의로 중첩 된 목록에서 작동합니다.