19
Tail-recursive Function, High-order Function 전전전전전전 2009/04/03

Tail-recursive Function, High-order Function

  • Upload
    odin

  • View
    183

  • Download
    0

Embed Size (px)

DESCRIPTION

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) ;;. - PowerPoint PPT Presentation

Citation preview

Page 1: Tail-recursive Function, High-order Function

Tail-recursive Function,High-order Function

전자계산입문

2009/04/03

Page 2: Tail-recursive Function, High-order Function

Tail-recursive Function

• [ 문제 1] factorial 을 계산하는 함수 fact 를 recursive function 으로 작성한다 .

• [ 실행결과 ]

Page 3: Tail-recursive Function, High-order Function

Tail-recursive Function

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

Page 4: Tail-recursive Function, High-order Function

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;;

Page 5: Tail-recursive Function, High-order Function

Tail-recursive Function

• [ 문제 2] exponentiation 을 계산하는 함수 pow 를 recursive function 으로 작성한다 .

( 인자 a 와 b 를 받아 ab 를 계산하는 함수 pow 작성 )

• [ 실행결과 ]

Pow 3 20(=320) 과 같이 pow 함수를 적용하는 경우 Ocaml 이 표현 할 수 있는 정수의 범위를 벗어나 overflow 가 발생한다 .

Page 6: Tail-recursive Function, High-order Function

Tail-recursive Function

• [ 모범답안 ]let rec pow a b = if b = 0 then 1 else a * pow a (b - 1);;

Page 7: Tail-recursive Function, High-order Function

Tail-recursive Function

• [ 실습 ] exponentiation 을 계산하는 함수 pow 를 tail-recursive function 으로 작성한다 .

• [ 모범답안 ]let pow a b = let rec pow' a b s = if b = 0 then s else pow' a (b-1) (s*a) in pow' a b 1;;

Page 8: Tail-recursive Function, High-order Function

Tail-recursive Function

• [ 문제 3] 2 진수를 10 진수로 바꾸는 함수bin2dec 을 recursive function 으로 작성한다 .

• [ 실행결과 ]

Page 9: Tail-recursive Function, High-order Function

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;;

Page 10: Tail-recursive Function, High-order Function

Tail-recursive Function

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

• [ 실행결과 ]

Page 11: Tail-recursive Function, High-order Function

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;;

Page 12: Tail-recursive Function, High-order Function

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;;

Page 13: Tail-recursive Function, High-order Function

High-order Function• 정수 x 와 y 의 합

let sum x y = x + y;;

- 오류가 아니다 . sum 2 는 함수이다 .

# sum 2;;- : int -> int = <fun>

1. sum 은 무엇인가 ?

- sum 은 함수이다 . type 은 int -> int -> int

2. sum 2 3 은 무엇인가 ?

- integer 이며 , 그 값은 5 이다

3. sum 2 는 무엇인가 ? 오류인가 ?

Page 14: Tail-recursive Function, High-order Function

High-order Function• 정수 x 와 y 의 합

즉 , sum 2 는 2 를 더하는 함수라 할 수 있다 .

4. 테스트# f 10;;- : int = 12# f 15;;- : int = 17# f 99;;- : int = 101

Page 15: Tail-recursive Function, High-order Function

High-order Function

• 함수의 argument 를 전부 주지 않는 경우let sum x y = x + y;;

let add2 = sum 2;;

add2 5;;

나머지 argument 를 받아 계산하는 함수가 됨( 아래와 완전히 동일한 의미 )

let add2 x = 2 + x;;

Page 16: Tail-recursive Function, High-order Function

High-order Function

• [ 실습 ] string_adder s 는 어떤 문자열 앞에 s 를 삽입하여 반환하는 함수 작성

• [ 실행결과 ]# string_adder;;- : string -> string -> string = <fun># let hello_adder = string_adder "Hello ";;val hello_adder : string -> string = <fun># hello_adder "della";;- : string = "Hello della"# let bye_adder = string_adder "Bye ";;val bye_adder : string -> string = <fun># bye_adder "della";;- : string = "Bye della"

Page 17: Tail-recursive Function, High-order Function

High-order Function

• [ 모범답안 ] 두 가지 방법

let string_adder s = fun x -> s ^ x;;

let string_adder s = let h s x = s ^ x in h s;;

Page 18: Tail-recursive Function, High-order Function

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

Page 19: Tail-recursive Function, High-order Function

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;;