2013-04-14 2 views
1

나는 Clojure에 익숙하다. 그래서 나는 누군가 내가 나쁘게 나에게 설명 할 수 있는지 궁금해하고있다. 나는 익숙해지기 위해서 4Clojure에서 몇 가지 문제를 해결하고 있는데, 그 중 하나는 Clojure에 내장 된 최대 함수을 사용하지 않고 가변 개수의 매개 변수 최대 값을 계산하는 것입니다 (). 내가 빈칸 채우기 위해 생각 해요 : 결과는이를 위해 4가변 개수의 매개 변수 최대 값 계산하기

입니다

(_ 1 8 3 4) 

그래서, 나는 가변 인수에 대응하는 기능을 구현하기 위해 노력하고 있습니다. Lisp의 모든 것은 재귀 적이어야하기 때문에 기본 경우는 하나의 요소 만있는 경우입니다.이 경우 max는 요소 자체입니다. 그 밖에, 나는 제 1 및 제 2 요소를 비교하고, 재귀 적으로 적절한 경우에 함수를 호출 :

(fn max-of 
    ; base case, only one element, return the element 
    ([x] x) 
    ; if more than one element... 
    ([x & more] 
     ; ...compare the first element and the second 
     ; if the first element is bigger than the second 
     ; drop the second element, else drop the first 
     (if (> x (first more)) (max-of (cons x (rest more))) 
           (max-of more)))) 

을하지만이 나 있습니다 :

user=>  ((fn max-of 
#_=>   ([x] x) 
#_=>   ([x & more] 
#_=>    (if (> x (first more)) (max-of (cons x (rest more))) 
#_=>         (max-of more)))) 
#_=>  1 8 3 4) 
(8 3 4) 

그리고 이것은 나에게 목록을 반환 내가 왜 아무 생각이 없다 그 목록에 내 기능을 호출하는 것과 반대입니다.

답변

1

단일 엔티티로 목록을 전달하는 최초의 재귀 호출에

(max-of 8 3 4)(max-of '(8 3 4)) 사이의 차이를 볼 수 있기 때문에

이 문제를 완화하기 위해 apply를 사용할 수 있습니다 :

(apply max-of (cons x (rest more)))

관련 문제