1. 开平方
使用原有的isGoodEnough函数时,写死的0.001就是其结果的精度。所以,guess在到达正负0.001的范围就会停止迭代,如果参数本身就是0.001这个数量级或更小的数,其误差(0.002)相对于正确的值就显得大了。而由于Double本身并不是连续的实数,当 x 非常大时,其低位的值将远大于0.001,也就是说 square(guess)的低位和 x 的低位数量级都太大,而Double是无法精确相等的,所以即使 guess 迭代到了正确的数值,isGoodEnough 也永远返回 false
既然是数值精度问题,那么只要把 0.001 从固定的绝对精度改成相对精度,比如 x * 0.00001 之类的就可以了。
2. 尾递归阶乘函数
虽然是初次接触尾递归,但是既然要保持同样的规模,那么就必须把当前递归的返回值传递到下一个函数的参数中去,再加上判断迭代终止的参数,就应该有两个参数吧?因此,我小小的做个弊,使用了一个双参数的嵌套函数:
1: def factorial(n: Int) = {
2: def f(a: Int, b: Int): Int = if(b == 1) a else f(a * b, b - 1)
3: f(1, n)
4: }