3

나는 약간의 숙제를하고있다. 그러나 나는 무엇인가 몇 시간 동안 붙어 있었다. 나는 그것이 정말로 사소한 것이 틀림 없다라고 확신하지만, 사용 가능한 모든 문서를 조사한 후에도 내 머리를 감쌀 수 없다. 아무도 나에게 손을 줄 수 있습니까? 기본적으로 OCaml 프로그래밍의 연습에서는 x^n 함수를 제곱 알고리즘으로 지수화하여 정의하도록 요청합니다.패턴 일치에서 변수가 매개 변수 생략을 허용하는 방법은 무엇입니까?

내가 솔루션을 검토 한 결과 :

let rec exp x = function 
    0 -> 1 
    | n when n mod 2 = 0 -> let y = exp x (n/2) in y*y 
    | n when n mod 2 <> 0 -> let y = exp x ((n-1)/2) in y*y*x 
    ;; 

내가 특히 이해하지 못하는 것은 매개 변수 n을 재미 문에서 생략 할 수 있으며, 이유는 대한 변수로 사용하는 방법입니다 제곱에 의한 거듭 제곱 정의와 뚜렷한 연관성이없는 x와 일치. ,

let rec exp x n = match n with 
    0 -> 1 
    | n when (n mod 2) = 1 -> (exp x ((n-1)/2)) * (exp x ((n-1)/2)) * x 
    | n when (n mod 2) = 0 -> (exp x (n/2)) * (exp x (n/2)) 
    ;; 
+2

두 번째 코드 조각의 첫 번째 및 두 번째 발생을 다른 변수 이름으로 변경하고 다른 변수 이름을 'n'으로두면 코드는 계속 작동합니다. 왜 그런지 이해하니? – sepp2k

+0

@ sepp2k 예, 저는 n과 물질적으로 일치하는 변수를 사용할 것입니다. 내가 이해할 수없는 것은 첫 번째 스 니펫이 "함수"를 사용하는 이유입니다. (이 맥락에서 "x와 일치하는 구문상의 설탕"입니다.) , x의 값을 검사하고 함수의 정의가 필요로하는 n의 값은 검사하지 않습니다. – rickmeizter

답변

2

버전이 문법적으로 정확 좋은 대답을 얻을 수 있지만, 실행하는 데 긴 : 여기

내가 그것을 할 것입니다 방법입니다. 코드에서 exp은 재귀 적으로 두 번 호출되므로 두 배의 계산을 내고 각 호출은 두 번 계산량이 두 배가되는 등 n=0까지 내려갑니다. 솔루션에서 exp은 한 번만 호출되며 결과는 변수 y에 저장되고 y은 제곱됩니다. 인수를 취하는 함수의 간청

let f = function 
    | 0 -> 0 
    | foo -> foo-1 

라인 let rec exp x = function된다 : x을하고 unnammed 인수

이하, 구문에 대해,

let f n = match n with 
    | 0 -> 0 
    | foo -> foo-1 

는 동등 패턴 일치에 사용됩니다. 패턴 일치에서, 라인

| n when n mod 2 = 0 -> 

이 인수는 n입니다. 다른 이름은 패턴 매칭의 각각의 경우에 사용될 수하지 않는 것이 (즉 명확하지 될 경우에도) :

| n when n mod 2 = 0 -> let y = exp x (n/2) in y*y 
| p when p mod 2 <> 0 -> let y = exp x ((p-1)/2) in y*y*x 
+0

OP는 '하자'에 대해 묻지 않았다. – sepp2k

+0

하자에 대한 조언 주셔서 감사합니다! 이제 "function"을 사용할 때 함수를 선언 할 때 _let_ 절에 선언 된 마지막 매개 변수 다음에 마지막 매개 변수가 하나 더 필요하다는 것을 알았습니다. 질문을 삭제해야합니까? – rickmeizter

+0

아니요, 질문을 계속하면 다른 사람에게 유용 할 수 있습니다. http://stackoverflow.com/faq – jrouquie

1

키워드 "기능"

match x with 

에 대한 syntaxic 설탕 아니다 하지만 이렇게

fun x -> match x with 

let rec exp x = function 
,691에 대한

은 내가 혼동을 피하기 위해 "Y"가 아니라 "n"을 쓴

let rec exp x y = match y with 

참고 솔루션과 과정에 상당이다

let rec exp x = fun y -> match y with 

로 대체 될 수있다. 일치 후에 도입 된 n 변수는 새로운 변수이므로 함수 매개 변수와 만 관련되어 있기 때문에 함수 매개 변수와 관련이 있습니다.예, 대신

let y = x in ... 

의를 위해 당신은 쓸 수 :

이 경기 발현
match x with y -> ... 

은 "Y"표현은 일치 "패턴"입니다. 그리고 어떤 패턴과도 마찬가지로, 변수 (여기 y)와 값이 일치합니다. (여기서 x의 값) 어떤 패턴과 마찬가지로 패턴의 변수는 이전에 정의 된 변수를 빗나가는 새로운 변수입니다. 귀하의 코드에서 :

let rec exp x n = match n with 
    0 -> 1 
    | n when (n mod 2) = 1 -> (exp x ((n-1)/2)) * (exp x ((n-1)/2)) * x 
    | n when (n mod 2) = 0 -> (exp x (n/2)) * (exp x (n/2)) 
;; 

두 경우의 변수 n은 매개 변수 n을 음영 처리합니다. 그러나 같은 이름을 가진 두 변수가 같은 값을 가지고 있기 때문에 이것은 문제가되지 않습니다.

+0

심지어 더 명확하게, 감사합니다. – rickmeizter