-
def sum(f: Int => Double)(a: Int, b: Int): Double = {
def iter(a: Int, result:Double):Double = {
if (a>b) result
else iter(a+1, result+f(a))
}
iter(a, 0)
}
-
def oper_iter(oper: (Double,Double)=>Double)(f: Int => Double)(a: Int, b: Int): Double = {
def iter(a: Int, result:Double):Double = {
if (a>b) result
else iter(a+1, oper(result,f(a)))
}
iter(a+1, f(a))
}
def product(f: Int => Double)(a: Int, b: Int): Double = oper_iter((x,y) => x*y)(f)(a,b)
def sum(f: Int => Double)(a: Int, b: Int): Double = oper_iter((x,y) => x+y)(f)(a,b)
def factorial(n:Int) = product(x=>x) (1,n)
def main(args: Array[String]) = {
println(sum(x=>x)(1,2))
println(factorial(4))
}
- j.w.
- j.w.
-
val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double) = Math.abs((x - y) / x) < tolerance
def fixedPoint(f: Double => Double)(firstGuess: Double) = {
def iterate(guess: Double): Double = {
val next = f(guess)
if (isCloseEnough(guess, next)) next
else iterate(next)
}
iterate(firstGuess)
}
def averageDamp(f: Double => Double)(x: Double) = (x + f(x)) / 2
def sqrt(x: Double) = fixedPoint(averageDamp(y => x/y))(1.0)
def cuberoot(x: Double) = fixedPoint(averageDamp(y => x/( Math.pow(y,2) )))(1.0)
def main(args: Array[String]) = {
println( sqrt(2.0) );
println( cuberoot(2.0) );
}
-
trait IntSet {
def incl(x: Int): IntSet
def contains(x: Int): Boolean
def union(s: IntSet): IntSet
def intersection(s: IntSet): IntSet
def foreach(f: Int => Unit)
def excl(x:Int): IntSet
}
class EmptySet extends IntSet {
def contains(x: Int): Boolean = false
def incl(x: Int): IntSet = new NonEmptySet(x, new EmptySet, new EmptySet)
def union(s: IntSet): IntSet = s
def intersection(s: IntSet): IntSet = this
def foreach(f: Int => Unit) = {}
def excl(x:Int): IntSet = this
}
class NonEmptySet(elem: Int, left: IntSet, right: IntSet) extends IntSet {
def contains(x: Int): Boolean =
if (x < elem) left contains x
else if (x > elem) right contains x
else true
def incl(x: Int): IntSet =
if (x < elem) new NonEmptySet(elem, left incl x, right)
else if (x > elem) new NonEmptySet(elem, left, right incl x)
else this
def union(s: IntSet): IntSet =
right.union(left.union(s.incl(elem)))
def intersection(s: IntSet): IntSet =
{
val le = left.intersection(s)
val ri = right.intersection(s)
val ret = le.union(ri)
if (s.contains(elem))
new NonEmptySet(elem, le, ri)
else
le.union(ri)
}
def foreach(f: Int => Unit) =
{
left.foreach(f)
f(this.elem)
right.foreach(f)
}
def excl(x:Int): IntSet =
if (x < elem) new NonEmptySet(elem, left excl x, right)
else if (x > elem) new NonEmptySet(elem, left, right excl x)
else left.union(right)
}
- j.w.
-
TODO
-
abstract class IntTree
case object EmptyTree extends IntTree
case class Node(elem: Int, left: IntTree, right: IntTree) extends IntTree
def contains(t: IntTree, x: Int): Boolean = t match
{
case EmptyTree => false
case Node(elem, left, right) =>
if (x < elem) contains (left, x)
else if (x > elem) contains (right, x)
else true
}
def insert(t: IntTree, x: Int): IntTree = t match
{
case EmptyTree => new Node(x, EmptyTree, EmptyTree)
case Node(elem, left, right) =>
if (x < elem) new Node(x, insert(left,x), right)
else if (x > elem) new Node(x, left, insert(right,x))
else t
}