import scala.util.control.TailCalls._
import scala.annotation._
object Sum extends App{
//1
def evenLength(xs:Seq[Int]):TailRec[Boolean]=
if(xs.isEmpty) done(true) else tailcall(oddLength(xs.tail))
def oddLength(xs:Seq[Int]): TailRec[Boolean]=
if(xs.isEmpty) done(false) else tailcall(evenLength(xs.tail))
println(evenLength(1 to 1000000).result)
//2
def sum1(xs:Seq[Int],partial:BigInt):TailRec[BigInt]=
if(xs.isEmpty) done(partial) else tailcall(sum1(xs.tail,xs.head+partial))
println(sum1(1 to 1000000,0).result)
//3
@tailrec def sum2(xs:Seq[Int],partial:BigInt):BigInt=
if(xs.isEmpty) partial else sum2(xs.tail,xs.head+partial)
println(sum2(1 to 1000000,0))
//4
def sum3(xs:Seq[Int]):BigInt=
if(xs.isEmpty) 0 else xs.head+sum3(xs.tail)
try{
println(sum3(1 to 1000000))
}catch{
case _ => println("wrong")
}
}