2014-09-05 2 views
2

안녕하세요, 저는 clojure에 대해 새로운 제품입니다. 목록의 각 최상위 요소에서 괄호 쌍을 제거하는 함수를 작성하려고합니다. 최상위 요소가 목록이 아니면 추가됩니다. 예를 들어,Clojure - 재귀 함수 위로

>(up '((1 2) (3 4))) 
(1 2 3 4) 

>(up '(x (y) z)) 
(x y z) 

바로 지금, 한 쌍의 괄호를 제거하려고하면 함수가 너무 빨리 끝나는 문제가 있습니다. 가능한 경우 다른 함수를 사용하지 않고 반복적으로이 작업을 수행하려고합니다. 나는 문제가 나는 단점 - 보내고 내 기능을 종료 중첩 된리스트의 마지막 요소로 하늘의리스트를,하지만 난 방법을 알아낼 수 없다는 것을 알고

(defn up [lst] 
    (if (empty? lst) 
    () 
    (if (list? (first lst)) 
     (up (first lst)) 
     (cons (first lst) (up (rest lst)))))) 

: 나는 순간에 무엇을 가지고 그렇지 않으면 할 수 있습니다. 그 자체 인 항목을 칠 때, 때문에

귀하의 기능이 너무 빨리 종료 ...

+0

괄호를 한 수준 만 평평하게 제거하거나 제거하려고합니까? 아래의 오스카의 대답은 시퀀스를 완전히 평평하게합니다. –

+1

나는 그것을 평평하게하고 싶다. –

답변

0

디에고의 코멘트는 여기에 다른 답변이 있었다 표시하는 것,하지만 난 지금이 ​​표시되지 않는, 그래서 여기 간다 목록에서 재귀 적으로 해당 항목에 up을 호출하고 원래 목록의 나머지 항목은 무시합니다. (up (first lst))

최소한의 코드 변경은 첫 번째 목록 항목과 나머지 목록의 연결에 대해 재귀 적으로 up을 호출하는 것입니다. (up (concat (first lst) (rest lst)))

up 대신 기존 핵심 기능 flatten을 사용하는 것이 훨씬 더 좋습니다.

참고로 큰 입력 목록에 스택 오버플로가 발생하지 않도록 up을 직접 호출하는 대신 recur을 사용하여 재귀를 수행하는 것이 일반적입니다.