Scala 프로그래밍 과제 3

   

  • 제출방법 : 작성한 코드를 ‘hw3.scala’라는 이름으로 저장한 후 아래 출력 화면을 캡쳐한 이미지와 함께 압축하여 ‘학번_hw3.zip’ 로 저장하세요. 압축된 파일을 Uclass 과제 게시판에 업로드하면 됩니다.
  • 제출기한 : 5월 20일 월요일 11:59pm

       

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

   

조교: Aditi(diwakarmzu@gmail.com)

   

모든 문제는 배정문을 사용하지말고 자기호출 함수로 작성하세요.

  1. 정수 $n$을 입력받아 $1$부터 $n$까지의 합을 구하는 함수 sum을 작성하세요.
  // 입력 n은 0보다 큰 정수라고 가정합니다.

  def sum(n: Int): Int = {
    // 자기호출 함수를 사용하여 계산합니다.
  }
  println("** p1 **")
  println(sum(100))

 

출력 예시: p1

   


  1. 숫자 $n$을 입력 받아 $n!$을 계산하는 팩토리얼 함수를 작성하세요.
// 입력 n은 0보다 큰 정수라고 가정합니다.

def fac(n: Int): Int = {
  // n이 1이면 1로 출력합니다
  // 그렇지 않으면 재귀함수를 사용하여 계산합니다.
}
println("** p2 **")
println(fac(9))

 

출력 예시: p2

   


  1. 피보나치 숫자를 출력하는 함수를 작성하세요. **
// 입력 n은 0보다 큰 정수라고 가정합니다.

def fib(n: Int): Int = n match {
  // n 이 1 또는 2면 1을 출력합니다.
  // n이 3 이상인 경우에는
}
println("** p3 **")
println(fib(10))

 

출력 예시: p3

   


  1. 최대 공약수를 계산하는 함수를 작성하세요. 유클리드 호제법을 이용하여 작성하세요.
// 입력 m과 n은 0 이상이고 m+n은 0보다 크다고 가정합니다.

def gcd(n: Int, m: Int): Int = {
  // 작은 값과 큰 값을 먼저 출력합니다.
  // 유클리드 호제법을 사용하여 자기호출 함수로 계산하세요
}
println("** p4 **")
println(gcd(15,20))

 

출력 예시: p4

   


  1. 정수 리스트에서 가장 큰 값을 찾아내는 함수를 작성하세요. List의 isEmpty와 drop()을 사용하세요.
// 입력 list는 List(3, 4, 14, 7, 2)와 같은 형태의 정수 리스트라고 가정합니다.

def max(list: List[Int]): Int = {
  // 정수 리스트에서 가장 큰 값을 반환하는 자기호출 함수를 작성하세요.
  // 빈 리스트를 입력받으면 0을 반환하세요.
  // 그렇지 않다면..
}
println("** p5 **")
println(max(x))

 

출력 예시:

p5

   


Hint: Scala에서는 아래와 같이 트리 자료구조를 정의하고 사용할 수 있습니다.
sealed trait Tree[Int]
case class Leaf[Int](elem: Int) extends Tree[Int]
case class Node[Int](elem: Int, left: Tree[Int], right: Tree[Int]) extends Tree[Int]

val tree = Node(7, Node(3, Leaf(1), Leaf(2)), Leaf(4))

  1. 자기호출 함수를 사용하여 트리에 존재하는 모든 정수 노드 값의 총합을 구하는 함수를 만들어보세요.
def sum_tree( t: Tree[Int]): Int = {  
    //재귀함수를 이용하여 트리의 합을 구하세요.
}

출력 예시(위의 트리를 입력으로 사용했을 때):

p6

   


  1. 자기호출 함수를 사용하여 트리의 깊이을 구하는 함수를 만들어보세요.
def depth(t: Tree[Int]): Int ={
  //재귀함수를 이용하여 트리의 깊이를 구하세요.
}

출력 예시(위의 트리를 입력으로 사용했을 때):

p7

   


  1. 자기호출 함수를 사용하여 이진 검색(binary search)을 통해 정수 $x$를 이진 트리 $t$로부터 검색하고 정수 $x$가 존재하면 true, 존재하지 않으면 false를 반환하는 함수를 만들어보세요.
def bin_search(t: Tree[Int], x: Int):Boolean =  {
  // 재귀함수를 이용하여 이진 검색을 수행합니다.
}

출력 예시(위의 트리와 정수 3을 입력으로 사용했을 때):

p8

   


  1. 자기호출 함수를 사용하여 곱하기, 더하기, 뺴기, 나누기, 나머지 연산자로 구성된산술식을 계산하는 함수를 만들어보세요.
def interp(exp: Exp[Int]): Int =  {
  // 재귀함수를 사용하여 함수를 작성하세요.
}

[입출력 예]

입력 예시:

val exp = ADD(SUB(INT(100), INT(10)), MUL(INT(2), INT(8)))

출력 예시:

p9

   


  1. 자기호출 함수를 사용하여 논리식을 계산하는 함수를 만들어보세요. 논리식에는 논리 연산자 AND, OR, NEGATION, IMPLICATION가 사용될 수 있으며 각각의 논리 연산자에 대한 진리표(truth table)는 여기를 참고하세요.

작성할 함수:

def formula(fma: Bool): Boolean = fma match {
  // 재귀함수를 사용하여 Neg, Or, And, Imply 논리 연산자로 구성된 논리식을 계산하는 함수를 만드세요
}

[입출력 예]

입력 예시:

val fma = Imply(And(True, Or(True, False)), False)

출력 예시:

p10