2012-11-11 2 views

답변

2

이 경우 템플릿을 사용하여 임의로 중첩 된 요소 목록을 탐색해야합니다. 예를 들어, 임의적으로 중첩 된 목록을 복사하는이 절차를 연구하십시오.

(define (copy lst) 
    (cond ((null? lst)    ; if list is empty 
     '())      ; return the empty list 
     ((not (list? (car lst))) ; if current element is not a list 
     (cons (car lst)   ; cons current element 
       (copy (cdr lst)))) ; with the rest of the list 
     (else      ; if current element is a list 
     (cons (copy (car lst))  ; cons recursive call over current element 
       (copy (cdr lst)))))) ; with recursive call over rest of the list 

작은 관례를 먼저 적용하십시오. 1이 기본 레벨이고 반환 된 모든 요소가 입력 목록의 원래 구조를 유지하지 않고 플랫 출력 목록에 있다고 가정 해 보겠습니다. 예 :

(elements-level '(1 2 3) 1) 
; => '(1 2 3) 

(elements-level '(1 (2) 3) 2) 
; => '(2) 

위의 템플릿을 염두에두고, 문제를 해결하기 위해 어떻게 수정할 수 있는지 알아 보겠습니다. 그래서

(define (elements-level lst lvl) 
    (cond ((or (null? lst) (< lvl 1))  ; if list is empty or below level 
     '())        ; return the empty list 
     ((not (list? (car lst)))   ; if current element is not a list 
     (if (= lvl <???>)     ; if `lvl` is the base level 
      (cons <???>     ; cons current element in list 
       (elements-level <???> lvl)) ; and advance recursion over cdr part 
      (elements-level <???> lvl))) ; else advance recursion over cdr part 
     (else        ; if current element is a list 
     (append       ; use `append` for flattening the list 
      (elements-level <???> <???>)  ; recur over car, decrease one level 
      (elements-level <???> <???>))))) ; recur over cdr, keep the same level 

시험이 목록과 절차, 그것은 수준 2에 대한 수준 1, '(2)에 대한 '(1)을 반환해야하며 : 나는 질문이 숙제처럼 보이기 때문에, 당신은 채우기에 공백 드리겠습니다

(elements-level '(1 (2 (3 (4 (5))))) 1) 
; => '(1) 
+0

공란에 기입 한 내용으로 귀하의 예에서는 효과가 있지만 내 것은 아닙니다.이 목록을 사용하고 있습니다 : '(leeg (ster (leeg)) (bal)) (ster (ster) ( – Daquicker

+0

그 목록에 대한 예상 출력은 얼마입니까? (예 :())() 어떤 수준? –

+0

첫 번째 lvl이 0이면 lvl 2로 반환해야합니다. (leeg, bal, ster, leeg, bal, bal, leeg, kaars) – Daquicker

0

난 당신이 다음과 같이 단계를 재귀를 사용할 수 있다고 생각 :

  1. 은 n 번째 깊이에서 모든 요소를 ​​개최 목록을 정의합니다.
  2. 중첩 루프의 각 요소에 대한 인수
  3. nested list, new listn 소요 재귀 함수를 만들고, N-1로 하위 목록과 깊이를 전달하여 재귀 함수 호출 자체.
  4. new list N = 0이 메소드가 완료되면

nested list의 모든 요소를 ​​추가 할 new list 깊이 n의 모든 요소.

가능한 향상 : 가능한 경우는리스트의 요소 중 일부는, n 번째 수준으로 확장되지 않는 다음 재귀 메서드를 호출하기 전에 요소의 유형을 확인 할 수 있습니다. 리프 유형 인 경우 요소를 새 목록에 추가하기 만하면됩니다.

+0

감사하지만 난 정말 어떻게하지 않는다 당신이 말한 것을 코드하기 위해서, 이것이 내가 만들지 만, 나는 그것이 작동하지 않을 것이라고 확신한다. (define (rec nestedlst newlst n) (if (= n 0) nestedlst (cond ((null? nestlst) ((atom? nestedlst) nestedlst) (else (append (recall)) nstlst newlst newlst (new nstlst) newlst (-n 1))))))))))))) – Daquicker

+0

@Daquicker : 당신은 어느 부분을 얻지 못하고 어떤 부분이 효과가 없을 것이라고 생각합니까? –

관련 문제