SICPをScalaで淡々と解く

30分プログラム、その398。SICPScalaで淡々と解くお。
csnagoyaのSICP読書会に参加するか迷いつつも、とりあえず演習問題だけは解いておく。

1.7

def average(x : Double, y : Double) =
  (x + y) / 2

def improve(guess : Double, x: Double) : Double =
  average(guess,x / guess)

/*
def isGood(guess : Double, x : Double) : Boolean =
  (x - guess*guess).abs < 0.001
*/
def isGood(guess : Double, prev : Double) : Boolean =
  (prev - guess).abs < 0.001

def sqrt(guess : Double, x : Double) : Double = {
  val next = improve(guess,x)
  if(isGood(guess,next)) {
    guess
  }else{
    sqrt(next,x)
  }
}

1.9

def isGood(guess : Double, prev : Double) : Boolean =
  (prev - guess).abs < 0.001

def improve3(y : Double, x : Double) =
  (x/(y*y) + 2 * y) / 3

def cube(guess : Double,x : Double) : Double= {
  val next = improve3(guess,x)
  if(isGood(guess,next)) {
    guess
  }else{
    cube(next,x)
  }
}

1.10

おお、クヌース先生のタワー記法ではないか。

def ackerman(x : Int, y : Int) : Int =
  if(y == 0){
    0
  }else if(x == 0){
    2 * y
  }else if(y == 1){
    2
  }else{
    ackerman(x-1,ackerman(x,y-1))
  }

// 2 * n
def f(n : Int) = ackerman(0,n)
    
// 2 ^ n
def g(n : Int) = ackerman(1,n)

// 2 ^^ n
def h(n : Int) = ackerman(2,n)