SICPをScalaで淡々と解く
30分プログラム、その398。SICPをScalaで淡々と解くお。
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)