Tail-recursive Function, High-order Function

1 / 19

# Tail-recursive Function, High-order Function - PowerPoint PPT Presentation

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

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about 'Tail-recursive Function, High-order Function' - odin

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

### 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)

;;

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

;;

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

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

• [실행결과]

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

Tail-recursive Function
• [모범답안]

let recpow a b =

if b = 0 then 1

else a * pow a (b - 1)

;;

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

;;

Tail-recursive Function
• [문제3] 2진수를 10진수로 바꾸는 함수bin2dec을 recursive 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

;;

Tail-recursive Function
• [실습] 2진수를 10진수로 바꾸는 함수bin2dec을 tail-recursive 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

;;

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

;;

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 =

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

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

4. 테스트

# f 10;;

- : int = 12

# f 15;;

- : int = 17

# f 99;;

- : int = 101

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

High-order Function
• 함수의 argument를 전부 주지 않는 경우

let sum x y = x + y;;

나머지 argument 를 받아 계산하는 함수가 됨

(아래와 완전히 동일한 의미)

let add2 x = 2 + x;;

High-order Function
• [실습] string_adders는 어떤 문자열 앞에 s를 삽입하여 반환하는 함수 작성
• [실행결과]

- : string -> string -> string =

valhello_adder : string -> string =

- : string = "Hello della"

valbye_adder : string -> string =

- : string = "Bye della"

High-order Function
• [모범답안]두 가지 방법

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

let

h s x = s ^ x

in

h s

;;

High-order Function
• [실습] integral f a b 는 int -> int 타입을 가지는 함수 f 를 구간 [a,b]에서 구분구적한 값을 반환하는 함수 작성. 구분구적에 사용하는 수식
• [실행결과]

# integral;;

- : (int -> int) -> int -> int -> int =

# let f x = 3*x*x + x - 9;;

val f : int -> int =

# integral f 0 0;;

- : int = 0

# integral f 0 10;;

- : int = 810

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

;;