html5-img
1 / 19

Tail-recursive Function, High-order Function

Tail-recursive Function, High-order Function. 전자계산입문 2009/04/03. Tail-recursive Function. [ 문제 1] factorial 을 계산하는 함수 fact 를 recursive function 으로 작성한다 . [ 실행결과 ]. Tail-recursive Function. [ 모범답안 ]. let rec fact n = if n = 0 then 1 else n * fact (n - 1) ;;.

odin
Télécharger la présentation

Tail-recursive Function, High-order Function

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tail-recursive Function,High-order Function 전자계산입문 2009/04/03

  2. Tail-recursive Function • [문제1] factorial 을 계산하는 함수 fact를 recursive function으로 작성한다. • [실행결과]

  3. Tail-recursive Function • [모범답안] let rec fact n = if n = 0 then 1 else n * fact (n - 1) ;;

  4. Tail-recursive Function • [실습] factorial 을 계산하는 함수 fact 를 tail-recursive function으로 작성한다. • [모범답안] let fact n = let rec fact' n accum = if n = 0 then accum else fact' (n - 1) (n * accum) in fact' n 1 ;;

  5. Tail-recursive Function • [문제2] exponentiation 을 계산하는 함수 pow 를 recursive function으로 작성한다. (인자 a와 b를 받아 ab를 계산하는 함수 pow 작성) • [실행결과] Pow 3 20(=320)과 같이 pow 함수를 적용하는 경우 Ocaml이 표현 할 수 있는 정수의 범위를 벗어나 overflow 가 발생한다.

  6. Tail-recursive Function • [모범답안] let recpow a b = if b = 0 then 1 else a * pow a (b - 1) ;;

  7. Tail-recursive Function • [실습] exponentiation 을 계산하는 함수 pow 를 tail-recursive function 으로 작성한다. • [모범답안] let pow a b = let recpow' a b s = if b = 0 then s else pow' a (b-1) (s*a) in pow' a b 1 ;;

  8. Tail-recursive Function • [문제3] 2진수를 10진수로 바꾸는 함수bin2dec을 recursive function으로 작성한다. • [실행결과]

  9. Tail-recursive Function • [모범답안] let rec bin2dec x = if x = 0 then 0 else if x = 1 then 1 else 2 * bin2dec (x/10) + x mod 10 ;;

  10. Tail-recursive Function • [실습] 2진수를 10진수로 바꾸는 함수bin2dec을 tail-recursive function으로 작성한다. • [실행결과]

  11. Tail-recursive Function • [오답] 착각하기 쉬운 답(하지만 반대로 계산 됨 -.-) let bin2dec n = let rec bin2dec' n accum = if n = 0 then accum else bin2dec' (n / 10) (accum * 2 + n mod 10) in bin2dec' n 0 ;;

  12. Tail-recursive Function • [모범답안] 또 하나의 변수를 이용해야 함 let bin2dec n = let rec bin2dec' n m accum = if n = 0 then accum else bin2dec' (n / 10) (m * 2) (accum + m * (n mod 10)) in bin2dec' n 1 0 ;;

  13. High-order Function • 정수 x 와 y 의 합 let sum x y = x + y;; 1. sum 은 무엇인가? - sum 은 함수이다. type은 int -> int -> int 2. sum 2 3 은 무엇인가? - integer 이며, 그 값은 5 이다 3. sum 2 는 무엇인가? 오류인가? # sum 2;; - : int -> int = <fun> - 오류가 아니다. sum 2는 함수이다.

  14. High-order Function • 정수 x 와 y 의 합 4. 테스트 # f 10;; - : int = 12 # f 15;; - : int = 17 # f 99;; - : int = 101 즉, sum 2는 2를 더하는 함수라 할 수 있다.

  15. High-order Function • 함수의 argument를 전부 주지 않는 경우 let sum x y = x + y;; let add2 = sum 2;; add2 5;; 나머지 argument 를 받아 계산하는 함수가 됨 (아래와 완전히 동일한 의미) let add2 x = 2 + x;;

  16. High-order Function • [실습] string_adders는 어떤 문자열 앞에 s를 삽입하여 반환하는 함수 작성 • [실행결과] # string_adder;; - : string -> string -> string = <fun> # let hello_adder = string_adder "Hello ";; valhello_adder : string -> string = <fun> # hello_adder "della";; - : string = "Hello della" # let bye_adder = string_adder "Bye ";; valbye_adder : string -> string = <fun> # bye_adder "della";; - : string = "Bye della"

  17. High-order Function • [모범답안]두 가지 방법 let string_adder s = fun x -> s ^ x;; let string_adder s = let h s x = s ^ x in h s ;;

  18. High-order Function • [실습] integral f a b 는 int -> int 타입을 가지는 함수 f 를 구간 [a,b]에서 구분구적한 값을 반환하는 함수 작성. 구분구적에 사용하는 수식 • [실행결과] # integral;; - : (int -> int) -> int -> int -> int = <fun> # let f x = 3*x*x + x - 9;; val f : int -> int = <fun> # integral f 0 0;; - : int = 0 # integral f 0 10;; - : int = 810

  19. High-order Function • [모범답안] let integral f a b = let rec integral' f a b s = if a = b then s else integral' f (a+1) b (f a + s) in integral' f a b 0 ;;

More Related