2012-02-21 2 views
1

저는 스키마 프로그래밍을 처음 접했고지도를 정의하고 추가하는 등 기본적인 알고리즘을 배우고 있습니다.한 차원에서 M 차원 목록을 변환하십시오.

그러나 구현을 찾을 수없는 알고리즘이 있습니다. 저는 M 차원의 목록을 하나의 차원으로 변형시키는 것에 대해 이야기합니다. 나는 혼자서 그것을 정의하려했지만 성공하지는 못했습니다.

내가 원하는 정확히 무엇 :

'(a b c (d (e)) (g f h)) => '(a b c d e g f h) 

답변

1

두 가지 방법이 있습니다. 목록이 있습니다. 첫째, 단지 원시 목록 절차를 사용하여 간단한 솔루션 :

(define (flatten lst) 
    (cond ((null? lst) 
     '()) 
     ((not (list? lst)) 
     (list lst)) 
     (else 
     (append (flatten (car lst)) 
       (flatten (cdr lst)))))) 

이 다른 솔루션 (요 클레멘트에 의해 제안)을 map 고차원 절차 및 apply를 사용

(define (flatten lst) 
    (if (not (list? lst)) 
     (list lst) 
     (apply append (map flatten lst)))) 

그리고 마지막으로는이를 덧글에 언급 된, 내장 된 flatten 절차는 라켓과 같은 일부 Scheme 구현에서 발견되었습니다 (bigloo에서 사용할 수 있는지 여부는 알 수 없습니다) :

(require racket/list) 
(flatten '(a b c (d (e)) (g f h))) 
+1

이 작품은 나를 위해. 매우 감사합니다! –

2

당신이 검색 할 용어 "결합"라고 생각합니다. 이것을 쓰는 가장 간단한 방법은 목록이 아니라면 그 목록을 포함하는 길이의 목록을 반환하는 것입니다. 이것이리스트라면, 재귀 호출을 그 요소에 매핑 한 결과에 append를 적용합니다.

+1

** flatten **은 Racket의 표준 라이브러리에 내장되어 있습니다. http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._flatten)) – dyoo

관련 문제