import scala.math._
import scala.util.Random
import scala.annotation.tailrec

object pi{
  def EulerRec(n : Int) : Double = {
    n match {
      case 1 => 1
      case _ => ( EulerRec(n-1) + (1.0/(n*n)))
    }
  }
  @tailrec
  def EulerRecT(n : Int, acc : Double) : Double = {
    n match {
      case 0 => acc
      case _ => EulerRecT(n-1,acc + 1.0/(n*n))
    }
  }

  def MCrec(n : Int) : Double = {
    var x = Random.nextDouble * 2.0 - 1.0
    var y = Random.nextDouble * 2.0 - 1.0
    n match {
      case 0 => 0.0
      case _ => if ((x*x+y*y)>1.0){MCrec(n-1)}else{1.0+MCrec(n-1)}
    }
  }

  def PiMCrec(n : Int) : Double = {
    4.0 * MCrec(n)/n
  }

  @tailrec
  def MCrecT(n : Int, acc : Double) : Double = {
    var x = Random.nextDouble * 2.0 - 1.0
    var y = Random.nextDouble * 2.0 - 1.0
    n match {
      case 0 => acc
      case _ => if ((x*x+y*y)>1.0){MCrecT(n-1,acc)}else{MCrecT(n-1,1.0+acc)}
    }
  }

  def PiMCrecT(n : Int) : Double = {
    4.0 * MCrecT(n,0)/n
  }


  def main(args: Array[String]): Unit = {
/*    println("Euler rec")
    println(Math.sqrt(6*EulerRec(5000)))
    println("Euler rec Term")
    println(Math.sqrt(6*EulerRecT(50000,0)))
*/
    println("MC rec")
    println(PiMCrec(5000))
    println("MC rec T")
    println(PiMCrecT(50000))

  }
}
