저는이 작업을 수행하는 방법에 대해 정말 당황 스럽습니다 ... 시작하는 방법을 알지조차 모릅니다. 이진 트리에 대해 수행하는 방법을 알고 있지만 중첩 된 목록의 어떤 형태로든 그것을 할 수 있기를 바랍니다.중첩 목록의 중첩 깊이 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. 중첩 된 목록의 요소를 결합 - 파이썬 3
- 5. Silverlight : 중첩 목록의 모든 항목에 바인딩
- 6. 캉캉 깊이 중첩 된 자원
- 7. 깊이 중첩 된 노선들은 3
- 8. 중첩 jquery 함수에서 값을 반환하십시오.
- 9. Java에서 중첩 클래스 유형을 반환하십시오.
- 10. 중첩 목록의 병렬 채우기
- 11. 중첩 목록의 항목을 파이썬으로 바꾸기
- 12. 지정된 중첩 된 자식이있는 모든 요소를 찾습니다.
- 13. 스칼라에서 중첩 목록의 역방향 처리
- 14. Rails에서 깊이 중첩 된 속성 정렬
- 15. 깊이 통합을 유지하면서 이름별로 중첩 세트 정렬
- 16. 중첩 된 요소를 CSS로 타겟팅하기
- 17. Silverlight에서 중첩 요소를 찾는 방법
- 18. CSS에서 목록의 중첩 된 앵커 선택
- 19. 중첩 목록의 문자열을 int로 변환하는 방법은 무엇입니까?
- 20. jQuery 중첩 정렬 - 중첩 된 LI 요소를 이동할 수 없습니다.
- 21. 목록의 모든 요소를 인쇄합니다. C++
- 22. 연결된 목록의 모든 요소를 제거하십시오.
- 23. 목록의 모든 요소를 트리밍하려면 어떻게해야합니까?
- 24. 모두 비 중첩/중첩
- 25. HTML5 중첩 된 목록의 텍스트 크기
- 26. 중첩 목록의 listchange 이벤트를 취소하는 방법은 무엇입니까?
- 27. 중첩 된 목록의 "toolbar"속성 설정
- 28. 중첩 목록의 일반 형식 매개 변수
- 29. Sencha Touch - 중첩 목록의 최상위 레벨에 setactiveitem
- 30. 중첩 목록의 요소 다시 구성 및 선택
나는이 같은 목록을 작업 할 : (1) (2 (3 4) 5 6 7 (8 (56 9))) 주석 FR – Daquicker