我的问题是通过Scala为整数创建一个sqrt函数
f.e。:sqrt(26)= 6,s²> = n sqrt(0)= 0,sqrt(1)= 1,sqrt(2)= 2,sqrt(3)= 2,sqrt(4)= 2,sqrt(5)到sqrt(9)= 3 ....
这是我提出的代码:
def sqrt (n: Int): Int = {
def sq (a: Int, n: Int): Int = {
val b = (a + n) / 2
val c = (b + n / b) / 2
if (b * b == n) b
else if (b * b < n) b + 1
else c
}
if (n == 0 || n == 1) n else sq (0 , n)
}
然而,它不适用于所有数字n&gt; = 0。 f.e。:6为2,我如何调整我的公式?
答案 0 :(得分:0)
尝试将更改类型设为Double。结果应该是显而易见的。
object Math {
def roundUp(d: Double) = math.ceil(d).toInt
def abs(x: Double) = if (x < 0) -x else x
def sqrt(x: Double) = roundUp( sqrtIter(1.0, x) )
def sqrtIter(guess: Double, x: Double): Double =
if (isGoodEnough(guess, x)) guess
else sqrtIter(improve(guess, x), x)
def isGoodEnough(guess: Double, x: Double) =
abs(guess * guess - x) < .01
def improve(guess: Double, x: Double) =
(guess + x / guess) / 2
}
val r = Math.sqrt(24)
答案 1 :(得分:0)
def sqrt (n: Int): Int = {
def sq (a: Int, n: Int): Int = if (a * a >= n) a else sq (a+1 , n)
if (sq (0 , n) * sq (0 , n) >= n) sq (0 , n) else sqrt (sq (0 , n))
}
这是一个简单而好的解决方案。
答案 2 :(得分:0)
我为Pavel的代码添加了一些小改进:roundUp
函数并没有真正加起来,而且它给出了错误的结果。由于平方根值通常包含小数,因此我将小数限制为2位数。
def trim(d:Double) = "%1.2f".format(d)
def sqrt(x: Double) = trim( sqrtIter(1.0, x) ) //(replace /**roundUp**/ with trim)