과제 1. OCaml에 익숙해지기

   

  • 제출방법 : 작성한 코드를 ‘hw1.ml’라는 이름으로 저장한 후 Uclass 과제 게시판에 업로드해주세요.
  • 제출기한 : 4월 7일 월요일 11:59pm

       

과제 진행 시 어려운 점이 있으면 Ed Discussion 게시판을 이용해 질문하세요. 게시판을 통해 하기 어려운 질문이라면 아래 TA 이메일을 통해 문의하시기 바랍니다.

  • 주의: 반복문 없이 순수 재귀 함수로만 문제를 해결하세요.

   

Pattern Matching에 익숙해지기

1. Tail of a List

list의 마지막 element를 반환하는 함수를 구현하세요. 함수의 type은 'a list → 'a option이 되어야 합니다.

## last ["a" ; "b" ; "c" ; "d"];;
- : string option = Some "d"
## last [];;
- : 'a option = None

2. Last Two Elements of a List

list의 마지막 두 원소를 반환하는 함수를 구현하세요.

## last_two ["a"; "b"; "c"; "d"];;
- : (string * string) option = Some ("c", "d")
## last_two ["a"];;
- : (string * string) option = None

3. N’th Element of a List

list에서 N번째 element를 반환하는 함수를 구현하세요. 0-index를 사용합니다.

## at 2 ["a"; "b"; "c"; "d"; "e"];;
- : string option = Some "c"
## at 2 ["a"];;
- : string option = None

HINT: let rec at position = function

4. Length of a List

list에 몇 가지 element가 있는지 반환하는 함수를 구현하세요.

## length ["a"; "b"; "c"];;
- : int = 3
## length [];;
- : int = 0

Follow-up: tail recursive하게 구현할 수 있나요?

5. Reverse a List

list를 뒤집으세요.

## rev ["a"; "b"; "c"];;
- : string list = ["c"; "b"; "a"]

6. Palindrome

list가 palindrome인지 확인하세요.

## is_palindrome ["x"; "a"; "m"; "a"; "x"];;
- : bool = true
## not (is_palindrome ["a"; "b"]);;
- : bool = true

HINT: 위에서 구현한 rev 함수를 사용하세요.

   

Recursion과 Tail Recursion에 익숙해지기

주어진 문제들을 tail recursion으로 구현합시다.

7. 두 정수 a, b의 최대공약수 (GCD) 구하기

두 정수 a, b의 최대공약수를 유클리드 호제법을 사용하여 구현하세요.

## gcd 48 18;;
- : int = 6

8. Factorial

자연수 n에 대해 n!을 계산하는 함수를 구현하세요.

## factorial 5;;
- : int = 120

   

Variants, Tuples에 익숙해지기

9. Variants

요일을 나타내는 type을 정의하고 주어진 요일의 다음 요일을 반환하는 함수를 구현하세요.

## get_next_day Sun;;
- : day = Mon

10. Tuple

Tuple의 각 요소의 순서를 바꿔서 반환하는 함수를 작성하세요.

## swap (3, 2);;
- : int * int = (2, 3)
## swap ("first", "second");;
- : string * string = ("second", "first")