2017-11-27 12 views
0

저는 Clojure 초보자이며 오류의 의미를 디코딩 할 수 없으며 시퀀스에서 가장 작은 숫자를 찾기 위해 왜 내 작은 프로그램에서 발생하는지 이해할 수 없습니다.시퀀스에서 가장 작은 수를 찾으려면 루프를 사용하여 실패합니다.

(defn find-min 
    [nums] 
    (loop [smallest 1000000 i 0] 
    (if (= (count nums) i) 
     smallest) 
    (if (< (nums i) smallest) 
     (recur (nums i) (inc i)) 
     (recur smallest (inc i))))) 


(find-min [3 4 0 2]) 

IndexOutOfBoundsException가 clojure.lang.PersistentVector.arrayFor (PersistentVector.java:158는)

이제

내가 바인딩 오류 중 인덱스하지만 첫 번째 경우 기능이 있음을 이해한다는 것을 걱정 걸리는 함수가 돌아 오면 왜 그렇게됩니까?

+0

에 중첩 된 두 번째 if을 넣어 할 수 있습니다. '돌아 오는 것 '같은 것이 없습니다. – ymonad

+1

@ymonad가 말한 것을 명확히하기 위해'return '과 같은 것이 있지만 암묵적이며 통일 된 규칙 집합을 따릅니다. 리스프를 너무 강력하게 만들지 만 초보자에게 혼란스럽게 만듭니다. 기능적 사고로의 가장 쉬운 전환은 파이프 라인의 관점에서 생각하는 것입니다. 목록에서 가장 작은 숫자를 원합니다. 그래서 우선 목록을 정렬하는 것이 중요합니다. 이제 목록의 첫 번째 요소가 가장 작아서 첫 번째 요소를 가져옵니다. '(first (sort nums))'Clojure는 내부를 평가하여 정렬의 리턴이 처음으로 전달된다. – Gary

답변

0

두 개의 if은 같은 레벨에 있으므로 둘 다 연속적으로 실행됩니다. 당신은 첫 번째`(있다면 ..) '과'초 (있는 경우 ..)`모두가 평가되는 최초 if

(defn find-min[nums] 
    (loop [smallest 1000000 i 0] 
     (if (= (count nums) i) 
     smallest 
     (if (< (nums i) smallest) 
      (recur (nums i) (inc i)) 
      (recur smallest (inc i))))))