2016-09-26 3 views
0

Я пытаюсь найти периметр полигона функциональным способом. Я старался изо всех сил, но я не мог сделать это чисто функциональным. Это мой код:Функциональное программирование: периметр многоугольника.

object Solution { 

    def main(args: Array[String]) { 
    var x:Double = 0 
    val N = scala.io.StdIn.readInt 
    val points = scala.io.Source.stdin.getLines().take(N).map(x=>x).toList 
    for(i <- 0 to N-1){ 
     if(i==N-1) x+=dist(List(points(i),points(0))) 
     else x += dist(List(points(i),points(i+1))) 
    } 
    println(x) 
    } 
    def dist(A: List[String]): Double = { 
    scala.math.sqrt(scala.math.pow((A(0).split(" ")(0).toDouble-A(1).split(" ")(0).toDouble),2) + scala.math.pow((A(0).split(" ")(1).toDouble-A(1).split(" ")(1).toDouble),2)) 
    } 
} 

я ввожу число точек многоугольника, а затем ввести декартовы координаты каждой точки в новой строке.

Может ли кто-нибудь помочь мне сделать его чисто функциональным?

+2

'.map (х => х)' ничего –

ответ

2

Начать с разделительными проблем:

// dist should just take 2 points 
def dist(a: (Double,Double), b: (Double,Double)): Double = ... 

// calculate perimeter 
def perimeter (points: List[(Double,Double)]): Double = { 
    // create a list of lines by connecting adjacent points 
    val lines = points zip (points.tail ++ List(points.head)) 
    // aggregate the length of each line using foldLeft (/:) 
    (0d /: lines)((acc, line) => acC++ dist(line._1, line._2)) 
} 

def main (args: Array[String]) { 
    // main just needs to parse the lines 
    val points = ... // parse the points 

    println(perimeter(points)) 
} 
+0

Спасибо за помощь не делать. Я сохранил определение функции dist и сделал его рекурсивным. Это помогло мне сделать его функциональным. –

0

Рассмотрим val n = 5 точек

val points = (1 to n).map(_ => Math.random * 10).toArray 

и функцию расстояния, например

def dist(a: Double, b: Double) = math.abs(a-b) 

Тогда итерацию непрерывно (в кругах) n раз на (сгруппированных) пары точек, к которым мы применяем dist,

Iterator.continually(points) 
     .flatten 
     .sliding(2) 
     .take(n) 
     .map { case a :: b :: Nil => dist(a,b) } 
     .sum 
Смежные вопросы