Scala By Example: 表达式与函数 习题

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: }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值