many
이 무엇인지 살펴 보겠습니다. 먼저 당신이 그것을 정의 :
(define (many n fn)
(cond
[(= n 0) true]
[else (many (sub1 n)
(local ((define k (time fn)))
k))]))
를 다음 호출 : 모든 반복에 무슨 여기
> (many 3 (add1 41))
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
#t
>
을 때 many
통화 자신을 재귀 적 :
가
(define (many 3 42)
(cond
[(= 3 0) true]
[else (many (sub1 3)
(local ((define k (time 42)))
42))]))
(define (many 2 42)
(cond
[(= 2 0) true]
[else (many (sub1 2)
(local ((define k (time 42)))
42))]))
(define (many 1 42)
(cond
[(= 1 0) true]
[else (many (sub1 1)
(local ((define k (time 42)))
42))]))
(define (many 0 42)
(cond
[(= 0 0) true]
[else (many (sub1 0)
(local ((define k (time 42)))
42))]))
many
귀하의 정의는 재귀 적으로 자신을 호출 첫 번째 (time fn)
응용 프로그램의 결과 값이지만 정확한 시간 정보를 수집하지 않으므로 올바르지 않습니다. 프로 시저 응용 프로그램이 아니라 값 (우리의 경우 (add1 41)
값)이 아닙니다.
(define (many n fn)
(cond
[(= n 0) fn]
[else (many (sub1 n)
(local ((define k (time fn)))
k))]))
을하고 다음을 얻을 것이다 : : 그냥 many
의 당신의 정의에 fn
와 true
대체
> (many 3 (add1 41))
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
42
>
당신은 모든 재귀 호출에 fn
가 42
동일 것을 알 수있다. 이는 많은 FP 언어가 모두 Applicative order 평가를 사용하고 에 대한 첫 번째 호출이 발생하기 전에 (add1 41)
이 평가되기 때문에 발생합니다.
따라서 우리는 두 번째 인수 (fn
가)의 많은에 전달됩니다 에게 기능을 (은 우리의 경우을 썽크) 보장하기 위해 lambda
을 사용해야합니다.
(define (many n fn)
(time (fn))
(if (= n 0)
true
(many (sub1 n) fn)))
출력 예 :
> (many 3 (lambda() (fact 10000)))
cpu time: 2734 real time: 2828 gc time: 1922
cpu time: 906 real time: 953 gc time: 171
cpu time: 891 real time: 953 gc time: 204
cpu time: 938 real time: 984 gc time: 251
#t
>
가 (fn)
상기 참조로서 기능 (lambda() (fact 10000)
(썽크)의 결과인가를 수행 time
이미 반응식 함수 애플리케이션이 발현 주위 ()
로 표현다시피 정확히 표현식을 전달하고 올바른 타이밍 정보를 표시합니다.
희망이 있습니다. 틀 렸으면 고쳐줘.
함수를 전달하지 않고'()'내부에서 표현식을 평가 한 결과입니다. –