2017-11-24 7 views
0

현재 다음 코드는 숫자 2를 전달할 때 2-10에서 목록을 반환합니다. 목록에서 첫 번째 요소 2을 반환하지 않기를 바랍니다. 내가 rest 기능은 내가 꼬리를 얻을 것이다 전화를하지만 난 다시에만 꼬리를 줘이 기능의 더 나은 리팩토링 생각할 수없는 경우어떻게 결과 목록을 작성하는 재귀 함수에서 꼬리를 얻을 수 있습니까?

boot.user=> (defn hierarchy [num] 
#_=> (when num 
#_=>  (lazy-seq (cons num (hierarchy (#(when (< % 10) (inc %)) num)))))) 
#'boot.user/hierarchy 

boot.user=> (hierarchy 2) 
(2 3 4 5 6 7 8 9 10) 

예상 결과는 내가 아는

(3 4 5 6 7 8 9 10) 

입니다. 내가 가독성을 위해이 방법으로 함수를 다시 것보다도 먼저

답변

2

:

(defn hierarchy [num] 
    (when (< num 10) 
    (lazy-seq (cons num (hierarchy (inc num)))))) 

user> (hierarchy 3) 
;;=> (3 4 5 6 7 8 9 10) 

다음 수 추상적 내부 함수의 재귀, 외부는 첫째 증가 할 것이다 동안 :

(defn hierarchy [num] 
    (letfn [(h-inner [num] (when (< num 10) 
          (lazy-seq (cons num (h-inner (inc num))))))] 
    (h-inner (inc num)))) 

user> (hierarchy 3) 
;;=> (4 5 6 7 8 9 10) 

또한이 작업은 range 또는 iterate 일 가능성이 가장 높지만 재귀 연습을위한 교육용 사례라고 생각됩니다.