저는이 작업을 수행하는 방법에 대해 정말 당황 스럽습니다 ... 시작하는 방법을 알지조차 모릅니다. 이진 트리에 대해 수행하는 방법을 알고 있지만 중첩 된 목록의 어떤 형태로든 그것을 할 수 있기를 바랍니다.중첩 목록의 중첩 깊이 n에있는 모든 요소를 반환하십시오.
답변
이 경우 템플릿을 사용하여 임의로 중첩 된 요소 목록을 탐색해야합니다. 예를 들어, 임의적으로 중첩 된 목록을 복사하는이 절차를 연구하십시오.
(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)
난 당신이 다음과 같이 단계를 재귀를 사용할 수 있다고 생각 :
- 은 n 번째 깊이에서 모든 요소를 개최 목록을 정의합니다.
- 중첩 루프의 각 요소에 대한 인수
- 로
nested list
,new list
및n
소요 재귀 함수를 만들고, N-1로 하위 목록과 깊이를 전달하여 재귀 함수 호출 자체. - 는
new list
N = 0이 메소드가 완료되면
에 nested list
의 모든 요소를 추가 할 new list
깊이 n
의 모든 요소.
가능한 향상 : 가능한 경우는리스트의 요소 중 일부는, n 번째 수준으로 확장되지 않는 다음 재귀 메서드를 호출하기 전에 요소의 유형을 확인 할 수 있습니다. 리프 유형 인 경우 요소를 새 목록에 추가하기 만하면됩니다.
감사하지만 난 정말 어떻게하지 않는다 당신이 말한 것을 코드하기 위해서, 이것이 내가 만들지 만, 나는 그것이 작동하지 않을 것이라고 확신한다. (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
@Daquicker : 당신은 어느 부분을 얻지 못하고 어떤 부분이 효과가 없을 것이라고 생각합니까? –
나는이 같은 목록을 작업 할 : (1) (2 (3 4) 5 6 7 (8 (56 9))) 주석 FR – Daquicker