- 제출방법 : 작성한 코드를 ‘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")