EECS101 전자계산입문여섯번째숙제 -리스트- (100 점 + 도전문제점수 50점 ) 오진오 제출마감 : 5월 1일 11:59pm 이번숙제에서는수업시간에배웠던리스트에대한기본개념을프로그래밍을통해익혀보고, 리스트를통해가능한문제해결방법에대해서알

Similar documents
즉, 두정수의사칙연산을계산하는함수를자기호출하면사칙연산이여러번들어간연산식도계산할수있다. 이번에는변수에대해생각해보자. 다음과같은연산식을계산한다고하자. let a = 2 a + 1 먼저 let과 사이의정의를보고변수 a에정수 2가저장되어있다는것을기억해둔다. 그다음에 뒤에오는연

PowerPoint 프레젠테이션

기본자료형만으로이루어진인자를받아서함수를결과값으로반환하는고차함수 기본자료형과함수를인자와결과값에모두이용하는고차함수 다음절에서는여러가지예를통해서고차함수가어떤경우에유용한지를설명한다. 2 고차함수의 예??장에서대상체만바뀌고중간과정은동일한계산이반복될때함수를이용하면전체연산식을간 단

설계란 무엇인가?

OCaml

금오공대 컴퓨터공학전공 강의자료

C 언어 프로그래밊 과제 풀이

Homework 1 SNU , Fall 2012 Kwangkeun Yi Due: 9/14, 24:00 Exercise 1 리스트합 큰순서대로 (descending order) 나열된정수리스트두개를받아서하나의 순서리스트로만드는함수 merge: int lis

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Exercise (10pts) k-친수 일반적으로 k진수(k > 1)는 다음과 같이 표현한다. d0 dn 여기서 di {0,, k 1}. 그리고 d0 dn 은 크기가 d0 k dn k n 인 정수를 표현한다. 이것을 살짝 확장해서 k친수 를 다음과 같이 정의

Microsoft PowerPoint - 26.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - Java7.pptx

HW5 Exercise 1 (60pts) M interpreter with a simple type system M. M. M.., M (simple type system). M, M. M., M.

윈도우즈프로그래밍(1)

17장 클래스와 메소드

Microsoft PowerPoint - chap04-연산자.pptx

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

chap x: G입력

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

chap 5: Trees

1 1 장. 함수와극한 1.1 함수를표현하는네가지방법 1.2 수학적모형 : 필수함수의목록 1.3 기존함수로부터새로운함수구하기 1.4 접선문제와속도문제 1.5 함수의극한 1.6 극한법칙을이용한극한계산 1.7 극한의엄밀한정의 1.8 연속

<3235B0AD20BCF6BFADC0C720B1D8C7D120C2FC20B0C5C1FE20322E687770>

OCW_C언어 기초

PowerPoint Presentation

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint 프레젠테이션

중간고사

3.2 함수의정의 Theorem 6 함수 f : X Y 와 Y W 인집합 W 에대하여 f : X W 는함수이다. Proof. f : X Y 가함수이므로 f X Y 이고, Y W 이므로 f X W 이므로 F0이만족된다. 함수의정의 F1, F2은 f : X Y 가함수이므로

함수공간 함수공간, 점열린위상 Definition 0.1. X와 Y 는임의의집합이고 F(X, Y ) 를 X에서 Y 로의모든함수족이라하자. 집합 F(X, Y ) 에위상을정의할때이것을함수공간 (function space) 이라한다. F(X, Y ) 는다음과같이적당한적집합과

PowerPoint 프레젠테이션

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

와플-4년-2호-본문-15.ps

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Template

제 12강 함수수열의 평등수렴

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-03.pptx

Homework 2 SNU , Fall 2015 Kwangkeun Yi due: 9/30, 24:00 Exercise 1 (10pts) k- 친수 일반적으로 k 진수 (k > 1) 는다음과같이표현한다. d 0 d n 여기서 d i {0,, k 1}. 그리

Java ...

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000

11장 포인터

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

제 3강 역함수의 미분과 로피탈의 정리

Microsoft PowerPoint - chap05-제어문.pptx

슬라이드 1

Lab 3. 실습문제 (Single linked list)_해답.hwp

슬라이드 1

슬라이드 1

PowerPoint Presentation

Chapter 4. LISTS

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Multi-pass Sieve를 이용한 한국어 상호참조해결 반-자동 태깅 도구

슬라이드 1

adfasdfasfdasfasfadf

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

Microsoft PowerPoint Relations.pptx

Homework 3 SNU , 2011 가을이광근 Program Due: 10/10, 24:00 Essay Due: 10/12, 15:30 이번숙제의목적은 : 수업시간에살펴본, 상식적인명령형언어의정확한정의를이해하고그실행기를구현해보기. 상식적인수준에서디자인


Act84_

Çмú´ëȸ¿Ï¼º

2012³â8¿ùÈ£˙ȸš

강의 개요

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

02장.배열과 클래스

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson2.pptx

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

OCaml ífl—로그랟밓

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft Word - PLC제어응용-2차시.doc

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

PowerPoint 프레젠테이션

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

statistics

Microsoft PowerPoint - chap06-5 [호환 모드]

슬라이드 1

강의 개요

게시판 스팸 실시간 차단 시스템

Microsoft PowerPoint 웹 연동 기술.pptx

리스트 (list), 선형리스트 (linear list): 순서를가진항목들의모임 집합 : 항목간의순서의개념이없음 L = n ( item0, item1,..., item -1) l 리스트의예 l 요일 : ( 일요일, 월요일,, 토요일 ) l 한글자음의모임 : ( ㄱ, ㄴ

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000 ±×to0.

1장. 리스트

서강대학교공과대학컴퓨터공학과 (1/5) CSE3081 (2 반 ): 알고리즘설계와분석 < 프로그래밍숙제 2> (v_1.0) 담당교수 : 임인성 2015 년 10 월 13 일 마감 : 10 월 31 일토요일오후 8 시정각 제출물, 제출방법, LATE 처리방법등 : 조교가

SNU =10100 =minusby by1000 ÇÁto0.03exÇÁto0.03exÇÁ=10100 =minusby by1000 ·Îto0.03ex·Îto0.03ex·Î=10100 =minusby by1000 ±×to0.

Microsoft PowerPoint - ch07 - 포인터 pm0415

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Microsoft PowerPoint - chap06-2pointer.ppt

FGB-P 학번수학과권혁준 2008 년 5 월 19 일 Lemma 1 p 를 C([0, 1]) 에속하는음수가되지않는함수라하자. 이때 y C 2 (0, 1) C([0, 1]) 가미분방정식 y (t) + p(t)y(t) = 0, t (0, 1), y(0)

Microsoft PowerPoint - chap06-1Array.ppt

= ``...(2011), , (.)''

Transcription:

EECS101 전자계산입문여섯번째숙제 -리스트- (100 점 + 도전문제점수 50점 ) 오진오 (kurin@postech) 제출마감 : 5월 1일 11:59pm 이번숙제에서는수업시간에배웠던리스트에대한기본개념을프로그래밍을통해익혀보고, 리스트를통해가능한문제해결방법에대해서알아봅니다. 부정행위에관한규정은 POSTECH 전자컴퓨터공학부학부위원회의 POSTECH 전자컴퓨터공학부부정행위정의 를따릅니다. (http://http://www.postech.ac.kr/~gla/cs101/disciplinary/index.html) 숙제가어렵거나이해가안가는부분이있다면교수님과조교님들을활용하세요. 최대한친절히도와드립니다. 단, 정답은가르쳐드리지않습니다. 숙제에관한질문은과목게시판을이용하시기바랍니다. 제 1 절 골격파일과검사파일 웹브라우저에서 http://www.postech.ac.kr/~gla/cs101/hw/hw6.ml과 http://www.postech.ac.kr/~gla/cs101/hw/hw6-check.ml 또는 FTP client에서 <Hemos home folder> /cs101 handin/hw6/hw6.ml과 <Hemos home folder> /cs101 handin/hw6/hw6-check.ml을내려받는다. 제 2 절 숙제작성법 골격파일 hw6.ml을내려받고 Emacs,gvim, 메모장과같은편집프로그램을이용하여골격파일을열면다음과같다. exception NotImplemented;; let rec reverse l = raise NotImplemented;; let rec map f l = raise NotImplemented;; let rec altersum l = raise NotImplemented;; let rec collatz_seq n = raise NotImplemented;; let rec remove_duplicate l = raise NotImplemented;; let rec intersection xl yl = raise NotImplemented;; 1

let rec poly l = raise NotImplemented;; let rec powerset l = raise NotImplemented;; (* sum type for DNA *) type dna = A T C G;; let rec subsequence xl yl = raise NotImplemented;; let rec prime_seq n = raise NotImplemented;; (* Challenge *) type a inf_list = Inf_list of (unit -> ( a * a inf_list));; let inf_hd x = match x with Inf_list y -> let (a,_) = y () in a;; let inf_tl x = match x with Inf_list y -> let (_,b) = y () in b;; let rec inf_nth l n = if n = 1 then inf_hd l else inf_nth (inf_tl l) (n - 1);; let inf_prime_seq () = raise NotImplemented; 문제에서설명하는함수를작성하기위해, raise NotImplemented를삭제하고문제가요구하는올바른연산식을채워넣는다. 예를들면, 1번문제의경우함수 reverse을작성하기위해함수의몸통연산식인 raise NotImplemented를지우고, reverse의올바른몸통연산식을작성한다. 연산식 raise NotImplemented는함수의몸통연산식이작성되지않았다는예외상황을표시하며, 의미자체는본숙제의해결에중요하지않다. 만약올바르게함수를정의할수없다고판단하는경우해당함수의몸통연산식인 raise NotImplemented을삭제하지않고그대로두어야한다. 제 3 절 타입확인및제출 문제에대한답을다작성한이후, 작성한숙제파일 hw6.ml의각함수가문제에서제시한타입을만족하는지확인하기위해다음과같이검사파일을이용한다. 골격파일을편집하여숙제를작성하였으므로이후골격파일과숙제파일은동일한파일인 hw6.ml을가리킨다. 숙제파일 hw6.ml과검사파일 hw6-check.ml을동일한폴더에위치시킨다. 명령프롬프트 ([ 시작 ] [ 프로그램 ] [ 보조프로그램 ] [ 명령프롬프트 ]) 를실행한후, cd명령어를이용해숙제파일과검사파일이위치한폴더로이동한다. 아래와같이 ocamlc 명령어를이용해숙제파일과검사파일을함께컴파일한다. ocamlc -o hw6-check.exe hw6.ml hw6-check.ml 컴파일한결과명령프롬프트에아무런메시지가나타나지않으면작성한함수들이모두올바른타입을가지고있음을의미한다. 숙제작성을마친후 FTP client를이용하여숙제파일인 hw6.ml을자신의숙제제출디렉토리인 <Hemos home folder> /cs101 handin/hw6/<hemos id> 에저장한다. 2

파일이름은반드시 hw6.ml 이어야한다. hw6.ml 이아닌다른이름의파일을제출하면 0 점처리 된다. 컴파일되지않는숙제는 0 점처리된다. 제 4 절 문제 1, 2번문제에서는 Ocaml의 List 라이브러리의함수를사용하지않는다. 3 10번문제에서는 List 라이브러리를자유로이사용할수있다. List.fold left 또는 List.fold right를사용한다면골격파일에서주어진 rec 키워드를무시해도된다. Question 1. [5점] 리스트의순서를거꾸로하는함수 reverse를작성하라. ( 타입 ) a list -> a list ( 설명 ) reverse l은원소의순서가거꾸로되어있는새로운리스트를반환한다. reverse [a 1 ; a 2 ;...; a n 1 ; a n ] 은 [a n ; a n 1 ;... ; a 2 ; a 1 ] 를반환한다. 예를들면 [1; 2; 3; 4; 5] 라는리스트를입력으로받으면 [5; 4; 3; 2; 1] 이라는리스트를반환한다. ( 주의 ) Ocaml에서제공하는 List 라이브러리는사용해서는안된다. # reverse;; - : a list -> a list = <fun> # reverse [1; 2; 3; 4; 5; 6];; - : int list = [6; 5; 4; 3; 2; 1] # reverse ["Pink Floyd"; "bluedawn"; "more than paradise"];; - : string list = ["more than paradise"; "bluedawn"; "Pink Floyd"] # reverse [1.; 2.; 4.; 5.3; 6.5];; - : float list = [6.5; 5.3; 4.; 2.; 1.] # reverse [];; - : a list = [] Question 2. [5점] 함수를리스트각각의원소에적용시키는함수 map을작성하라. ( 타입 ) ( a -> b) -> a list -> b list ( 설명 ) map f l은 l의각원소에함수 f를적용한결과를반환한다. 즉 map f [a 1 ; a 2 ;... ; a n 1 ; a n ] 은 [f a 1 ; f a 2 ;... ; f a n 1 ; f a n ] 을반환한다. ( 주의 ) Ocaml에서제공하는 List 라이브러리는사용해서는안된다. # map;; - : ( a -> b) -> a list -> b list = <fun> # map (fun x -> x+2) [1; 2; 3; 4; 5; 6];; - : int list = [3; 4; 5; 6; 7; 8] # map (fun x -> not x) [true; false; true; true];; 3

- : bool list = [false; true; false; false] # map (fun x -> "my favorite band is "^x) ["Mot"; "bluedawn"];; - : string list = ["my favorite band is Mot"; "my favorite band is bluedawn"] Question 3. [10 점 ] altersum 을작성하라. ( 타입 ) int list -> int 리스트 [a 1 ; a 2 ;...; a n ] 를입력으로받아 n k=1 ( 1)k 1 a k 을구하는함수 ( 설명 ) altersum l 은리스트 l 의원소의부호를바꿔가며합을구하는함수이다. altersum [a 1 ; a 2 ;...; a n ] 은 n k=1 ( 1)k 1 a k 을계산한다. 예를들어 altersum [10; 11; 12; 13] 은결과값으로 10-11+12-13 을계 산하여 -2 를반환한다. # altersum;; - : int list -> int = <fun> # altersum [1; 2; 3; 4; 5; 6; 7; 8];; - : int = -4 # altersum [-10; 10; -10; 10];; - : int = -40 # altersum [];; - : int = 0 Question 4. [10 점 ] collatz 수열을리스트로반환하는함수를작성하라. ( 타입 ) int -> int list ( 설명 ) k 를초항으로가지는 collatz 수열 a n 은다음과같이정의된다. a 0 = k a n 1 이 1 이아닌홀수인경우 a n = 3a n 1 + 1 a n 1 이짝수인경우 a n = 1 2 a n 1 a n 1 이 1인경우수열은종결되며, a n 은정의되지않는다 collatz seq k는정수 k를초항으로하는 collatz수열을리스트형태로반환한다. 예를들어, 15를초항으로하는 collatz수열은 15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1 이므로 collatz seq 15는 [15; 46; 23; 70; 35; 106; 53; 160; 80; 40; 20; 10; 5; 16; 8; 4; 2; 1] 을반환한다. 결과리스트는초항부터시작하여순서대로나열되어있어야한다. 즉 [a 0 ; a 1 ;...] 순이되어야한다. ( 가정 ) k > 0 # collatz_seq;; - : int -> int list = <fun> # collatz_seq 10;; - : int list = [10; 5; 16; 8; 4; 2; 1] # collatz_seq 15;; - : int list = [15; 46; 23; 70; 35; 106; 53; 160; 80; 40; 20; 10; 5; 16; 8; 4; 2; 1] 4

Question 5. [10점] 리스트내에중복되는원소를제거해주는함수 remove duplicate를작성하라. ( 타입 ) a list -> a list ( 설명 ) remove duplicate l은리스트 l에서중복되는원소를하나만남기고제거한리스트를반환한다. 예를들어 [1; 1; 1; 1] 을입력으로받으면 [1] 을반환한다. 결과리스트에서원소의순서는중요치않다. 예를더들면 [1; 2; 3; 2] 를입력으로받으면 [1; 2; 3], [1; 3; 2], [2; 1; 3], [2; 3; 1], [3; 1; 2], [3; 2; 1] 중하나를반환해야한다. # remove_duplicate;; - : a list -> a list = <fun> # remove_duplicate [1; 2; 3; 4; 3; 2; 3; 2];; - : int list = [1; 2; 3; 4] # remove_duplicate ["a"; "b"; "hi"; "b"; "goldbar"; "hi"];; - : string list = ["a"; "b"; "hi"; "goldbar"] # remove_duplicate [true; false; true; false; false];; - : bool list = [true; false] # remove_duplicate [(1, 2); (2, 3); (1, 3); (2, 3)];; - : (int * int) list = [(1, 2); (2, 3); (1, 3)] # remove_duplicate [];; - : a list = [] Question 6. [10점] 리스트를집합으로생각하여교집합을구하는함수 intersection를작성하라. ( 타입 ) a list -> a list -> a list ( 설명 ) 리스트는집합으로해석할수있다. intersection xl yl은리스트 xl, yl을각각집합으로간주하고그교집합을구하는함수이다. 최종으로반환하는리스트에서원소의순서는중요하지않다. 예를들면 intersection [1; 2; 4] [2; 3; 4] 는두개의집합에공통적으로들어가는원소가 2, 4이므로반환값으로 [2; 4] 이나 [4; 2] 를반환한다. ( 가정 ) 입력받은리스트에는중복되는원소가존재하지않는다. 예를들면 [1; 2; 3; 1] 처럼원소가중복되는경우는입력값으로들어오지않는다고가정한다. # intersection;; - : a list -> a list -> a list = <fun> # intersection [1; 3; 5; 6] [2; 3; 4; 7];; - : int list = [3] # intersection [true; false] [false];; - : bool list = [false] # intersection ["ACT"; "TGC"; "TCA"; "GAC"; "AAC"] ["AAC"; "CGT"; "TCA"; "GAA"];; - : string list = ["TCA"; "AAC"] # intersection [] [];; - : a list = [] Question 7. [10점] 리스트로부터다항함수를만드는함수 poly를작성하라. ( 타입 ) int list -> (int -> int) 5

( 설명 ) poly l은리스트 l의원소를다항함수의계수로파악하고다항함수를생성해반환하는함수이다. 다항함수는각항의계수를원소로가지는리스트로표현할수있다. 즉다항함수 f(x) = a n x n + a n 1 x n 1 +... + a 1 x + a 0 는리스트 [a n ; a n 1 ;...; a 1 ; a 0 ] 로표현할수있다. 반대로 [a n ; a n 1 ;...; a 1 ; a 0 ] 라는계수의리스트를알면다항함수 f(x) = a n x n +a n 1 x n 1 +...+a 1 x+a 0 를생성할수있다. poly [a n ; a n 1 ;...; a 1 ; a 0 ] 는 f(x) = a n x n + a n 1 x n 1 +... + a 1 x + a 0 에해당하는함수를생성하여반환한다. 입력값이 [] 인경우 f(x) = 0에해당하는상수함수를반환한다. # poly;; - : int list -> int -> int = <fun> # poly [3; 2; 1] 0;; - : int = 1 # poly [3; 2; 1] 1;; - : int = 6 # poly [3; 2; 1] 2;; - : int = 17 # poly [-5; 3; 2; 1] 5;; - : int = -539 # poly [] 1;; - : int = 0 # poly [] 2;; - : int = 0 Question 8. [10점] 리스트를집합으로생각하였을때, 리스트를입력받아멱집합을반환하는함수 powerset을작성하라. ( 타입 ) a list -> a list list ( 설명 ) 리스트는집합으로해석할수있다. powerset l은 l의멱집합을구하여리스트의리스트타입 (( a list) list) 으로멱집합을반환한다. 부분집합간순서, 부분집합내원소의순서는중요하지않다. 예를들면 powerset [1] 의경우반환값이 [[]; [1]] 와 [[1]; []] 중무엇이되어도좋다. 하지만반환되는리스트역시집합이므로중복되는원소가있어서는안된다. powerset [1] 의경우 [[]; [1]; []] 는잘못된반환값이다. ( 가정 ) 입력받은리스트에는중복되는원소가존재하지않는다. 예를들면 [1; 2; 3; 1] 처럼원소가중복되는경우는입력값으로들어오지않는다고가정한다. # powerset;; - : a list -> a list list = <fun> # powerset [1;2;3];; - : int list list = [[1; 2; 3]; [1; 2]; [1; 3]; [1]; [2; 3]; [2]; [3]; []] # powerset ["a";"b";"c";"d"];; - : string list list = [["a"; "b"; "c"; "d"]; ["a"; "b"; "c"]; ["a"; "b"; "d"]; ["a"; "b"]; ["a"; "c"; "d"]; ["a"; "c"]; ["a"; "d"]; ["a"]; ["b"; "c"; "d"]; ["b"; "c"]; 6

["b"; "d"]; ["b"]; ["c"; "d"]; ["c"]; ["d"]; []] # powerset [];; - : a list list = [[]] Question 9. [10점] 생명공학에서 DNA분석은중요한문제이다. DNA는 A, T, C, G( 아데닌, 티민, 시토신, 구아닌 ) 4가지염기의조합으로이루어져있고, 4가지염기의조합에따라생명체의유전형질이결정된다. 그렇기때문에 DNA 염기서열에특정한염기서열이포함되어있는지를확인하는작업은 DNA연구에필수적이다. subsequence xl yl은 DNA 염기서열 xl에염기서열 yl이포함되어있는지검사한다. 4가지염기를표현하기위하여타입 dna가다음과같이정의되었다. type dna = A T C G;; ( 타입 ) dna list -> dna list -> bool ( 설명 ) 리스트 L 1 과 L 2 에대해서 L 1 = l 1 @ L 2 @ l 2 를만족하는리스트 l 1, l 2 가존재할때 L 2 는 L 1 에포함된다고말한다. 예를들면 [1; 2; 3; 4; 5; 6] 와 [3; 4; 5] 에대해 [1; 2; 3; 4; 5; 6] = [1; 2] @ [3; 4; 5] @ [6] 이므로 [3; 4; 5] 은 [1; 2; 3; 4; 5; 6] 에포함된다. 또다른예로 [1; 2; 3; 4; 5; 6] 와 [4; 5; 6] 는 [1; 2; 3; 4; 5; 6] = [1; 2; 3] @ [4; 5; 6] @ [] 을만족하므로 [4; 5; 6] 은 [1; 2; 3; 4; 5; 6] 에포함된다. 하지만 [4; 6] 는 [1; 2; 3; 4; 5; 6] = l 1 @ [4; 6] @ l 2 을만족하는 l 1, l 2 가존재하지않으므로 [1; 2; 3; 4; 5; 6] 에포함되지않는다. subsequence xl yl은염기서열 yl이 DNA 염기서열 xl에포함되어있는지검사하여포함되어있으면 true, 포함되어있지않으면 false를반환하는함수이다. # subsequence;; - : dna list -> dna list -> bool = <fun> # let seq = [A; C; T; G; C; T; G; T; G; C; G; C; T; G];; val seq : dna list = [A; C; T; G; C; T; G; T; G; C; G; C; T; G] # subsequence seq [T; C; G];; - : bool = false # subsequence seq [G; C; T];; - : bool = true # subsequence [G; C; T] [];; - : bool = true # subsequence [] [];; - : bool = true Question 10. [20점] 에라토스테네스의체를이용하여소수의리스트를계산하는함수 prime seq를작성하라.( 이문제의배점은 20점입니다 ) ( 타입 ) int -> int list ( 설명 ) prime seq n은에라토스테네스의체를이용하여입력받은정수 n이하의모든소수를리스트의형태로반환한다. 에라토스테네스의체는소수를구하기위한방법으로 [2; 3; 4;...; n] 처럼 2부터 n까지의모든자연수들의리스트가있을때, 가장먼저있는원소로나누어떨어지는원소를지워나가는방식으로소수를찾아낸다. 예를들면 [2; 3; 4; 5; 6; 7; 8; 9; 10] 이라는리스트를살펴보면가장앞에있는원소인 2로 [3; 4; 5; 6; 7; 8; 9; 10] 의원소를나누어, 나누어떨어지는 4, 6, 8, 10을삭제하고나누어떨어지지않는 3, 5, 7, 9는남긴다. 같은방법을남은리스트 [3; 5; 7; 9] 에대해서 7

도적용한다. 이러한과정을반복해나가면마지막에리스트에남는숫자들은모두소수이다. 에라토스테네스의체방법은 2부터시작하는리스트를대상으로한다. ( 가정 ) n 2 # prime_seq;; - : int -> int list = <fun> # prime_seq 2;; - : int list = [2] # prime_seq 10;; - : int list = [2; 3; 5; 7] # prime_seq 100;; - : int list = [2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47; 53; 59; 61; 67; 71; 73; 79; 83; 89; 97] 제 5 절도전문제 (50 점 ) [ 알림 ] 도전문제에대한질문은일체받지않습니다. OCaml은함수가정의될때몸통연산식을바로계산하지않고, 함수의적용이일어날때몸통연산식을계산한다. 함수몸통연산식의계산이지연되는예로다음함수를생각해보자. # let f () = 2 + 3;; val f : unit -> int = <fun> 함수 f는 unit 타입의값 () 을인자로받으면 2 + 3의계산결과를반환한다. ( 따라서 f의인자는계산에이용되지않고무시된다.) 위의정의에서몸통연산식 2 + 3은바로계산되어 5로대체될수도있지만, OCaml은 f가 () 에적용이될때비로소 2 + 3을계산한다. 즉함수 f는정의시점에서몸통연산식 2 + 3을계산하지않고그대로지니고있다가함수적용 f () 이계산될때몸통연산식 2 + 3을계산하는것이다. 위와같은 Ocaml의특징을이용하면무한개의원소로이루어진리스트를표현할수있다. 무한개의원소로이루어진리스트를표현하기위해서다음의타입 a inf list를이용한다. type a inf list = Inf list of (unit -> ( a * a inf list));; 생성자 Inf list의인자는 unit -> ( a * a inf list) 타입의함수로서리스트의첫번째원소 ( a 타입 ) 와나머지리스트 ( a inf list 타입 ) 로이루어진튜플을반환한다. Inf list의인자로이용하는함수는호출되기전까지몸통연산식을계산하지않음에주목하자. a inf list 타입의이용을돕기위해골격파일은아래의세함수를제공한다. let inf_hd x = match x with Inf_list y -> let (a,_) = y () in a;; let inf_tl x = match x with Inf_list y -> let (_,b) = y () in b;; let rec inf_nth l n = if n = 1 then inf_hd l else inf_nth (inf_tl l) (n - 1);; 8

inf hd는 a inf list -> a 타입을 가지고, inf hd l은 무한개의 원소로 이루어진 리스트 l의 첫 번 째 원소를 반환한다. inf tl은 a inf list -> a inf list 타입을 가지고, inf tl l은 무한개의 원소로 이루어진 리스 트 l의 첫 번째 원소를 제외한 나머지 리스트를 반환한다. inf nth는 a inf list -> int -> a 타입을 가지고, inf nth l n은 무한개의 원소로 이루어진 리 스트 l의 n번째 원소를 반환한다. Question [50점] 에라토스테네스의 체를 이용하여 소수의 리스트를 반환하는 함수 inf prime seq를 작 성하라. (타입) unit -> int inf list (설명) inf prime seq ()는 에라토스테네스의 체를 이용하여 2부터 시작하는 모든 소수를 크기 순서 대로 나열하는 int inf list타입의 리스트를 반환한다. (힌트) OCaml이 제공하는 List 라이브러리는 a inf list타입에 적용이 불가능하다. 그러나 List라 이브러리에 포함되어 있는 함수들을 a inf list 타입을 위한 함수로 바꾸어 보면 문제를 해결하는 데에 힌트를 얻을 수 있다 된다. 특히 inf hd, inf tl, inf nth 함수의 작동 원리를 이해하는 것이 a inf list 타입을 사용하는데 큰 도움이 된다. (실행 예) # inf_prime_seq;; - : unit -> int inf_list = <fun> # let prime = inf_prime_seq ();; val prime : int inf_list = inf_list <fun> # inf_hd prime;; - : int = 2 # inf_nth prime 10;; - : int = 29 # inf_nth (inf_prime_seq ()) 1000;; - : int = 7919 제6절 질문시 유의 사항 아래와 같은 질문은 삼가해주기 바랍니다. (코드의 내용을 보여주면서) "제 코드가 요구사항대로 동작하지 않는데 어느 부분이 잘못된 건가요?" 자신이 작성한 코드를 보여주면서 틀린부분을 찾아달라는 질문에 대하여 대답해 줄 수 없습니다. "제 코드의 함수 f는 타입이 int->int->int 인데요, 핸드아웃에는 int->(int->int) 라고 되어 있어요, 괜찮은가요?" 핸드아웃의 2절 타입 확인부분을 읽고 지시대로 따라하면 됩니다. "핸드아웃의 실행 예는 다 만족하는데요 그러면 제 코드가 올바르게 작성된 것인가요?" 어떤 입력 값을 넣었을때 자기가 짠 코드가 올바른지 판단하는 몫은 학생여러분 자신들에게 있습 9

니다. 단, 강의게시판에 자신이 테스트한 케이스를 올려두고 다른 학생들의 것과 비교해보는 것은 상 관없습니다. "제가 짠 코드를 복사해서 Ocaml 해석기에 붙여넣어서 테스트하면 잘 되는데 컴파일 하면 에러가 나요 ㅠㅠ." 편집기에서 복사해서 Ocaml 해석기에 붙여넣지 말고, Ocaml 해석기의 [File] [Open] 을 이용 하거나 컴파일러를 이용합니다. 제7절 숙제에 대한 의견 숙제에 대한 학생들의 모든 의견을 환영합니다. 숙제에 대한 의견이 있으면 http://pl.postech.ac.kr/~gla/feedback/ 페이지를 방문하여 의견을 익명으로 남겨주시길 바랍니다. 여러분들의 의견은 향후 숙제 설계와 강의 준비 에 중요한 자료로 이용됩니다. 의견을 남기는 사람에 대한 어떤 정보도 저장되지 않습니다. 10