Scala函数循环

Scala提供了if-else表达式来表达条件判断。和java中的if-else类似,但是适用于表达式而不是语句。例子:

1
def abs(x: Double) = if (x >=0) x else -x

x >= 0是一个Boolean类型的谓语(或者叫断言也比较合适)。

布尔表达式可以有如下方式组成:

1
2
3
4
true false    // 常量
!b // 非
b && b // 且
b || b // 或

以及一些常见的比较操作:

1
e <= e, e >= e, e < e, e > e, e == e, e != e

下面是Boolean表达式的一些计算规则(e指任意表达式):

1
2
3
4
5
6
!true --> false
!false --> true
true && e --> e
false && e --> false
true || e --> true
false || e --> e

值得注意的是,&&||的右值函数有时候并不需要计算。

Scala实现平方根计算

计算平方根

定义一个方法:

1
2
/** 计算参数的平方根 */
def sqrt(x: Double): Double = ...

经典的解法是利用牛顿法逐步逼近来计算sqrt(x):

1
2
3
4
5
Estimation     Quotient                 Mean
1 2 / 1 = 2 1.5
1.5 2 / 1.5 = 1.333 1.4167
1.4167 2 / 1.4167 = 1.4118 1.4142
1.4142 .... ....

Scala实现

首先,我们定一个方法用来表示每一次的迭代:

1
2
3
def sqrtIter(guess: Double, x: Double): Double = 
if (isGoodEnough(guess, x)) guess
else sqrtIter(improve(guess, x), x)

需要注意的是sqrtIter是递归调用的。在Scala中,递归方法需要明确的返回类型,对于非递归方法,返回值类型是可选的。
接下来,让我们定义方法improve来优化估计值和方法isGoodEnough来检查是否可以结束求值:

1
2
3
4
5
def improve(guess: Double, x: Double) = 
(guess + x /guess) / 2

def isGoodEnough(guess: Double, x: Double) =
abs(guess * guess - x) < 0.001

最后,我没来实现sqrt函数:

1
def sqrt(x: Double) = sqrtIter(1.0, x)

总结

通过上面的学习,我们了解了Scala中函数式编程的简单规则:

  • 算术和布尔表达式
  • 条件表达式if-else
  • 递归函数

我们介绍了两种求值策略,按值调用和按名调用,以及两者的不同。
我们了解了关于程序执行的推理方法:使用替换模型简化表达式。

Scala尾递归 Redis的事务

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×