您的位置:首页 > 其它

高阶函数应用

2016-01-10 10:41 190 查看
package
com.jn.scala.scalalearn

/**

* 求平方根 迭代算法

* Created by jiangning on 2016/1/9.

*/

object
SqrtTest {

/**

*

* @param a
算法的初始值或称高效能预测值

* @param b
需要求平方的数字

* @return


*/

def
sqrt(a:Double,b:Double):Double={

val
next = (a+b/a)/2

sqrt(next,b)

next

}

// 在写好上面的方法后发现会是无限循环,即死循环

// 第一次改进:对上面的方法进行改进,什么时候跳出循环,进行科里化

def
sqrt2(a:Double)(b:Double):Double={

val
next = (a+b/a)/2

if(b-next * next >
0.001
|| next*next-b >
0.001)
sqrt2(next)(b)

next

}

val
one
=
sqrt2(1
) _

val
m
=
one(2)

// 第二次改进,进行柯里化,定义第一个参数为函数,第二个参数为Double类型,

// 第三个函数为Double

def
SQ(f:(Double,Double) => Double)(a:Double)(b:Double):Double={

val
next = f(a,b)//这里可以定义求平方根,也可以定义求别的函数

if(b-next * next >
0.001
|| next*next-b >
0.001)
SQ(f)(next)(b)

next

}

//定义函数

def
f(a:Double,b:Double)={

(a+b/a)/2

}

val
one2
=
SQ(f)(
1)_

val
m2
=
one2(2)

// 第三次改进

// 去掉返回值,因为这里返回的是函数,所以不用定义返回值,将函数进行修改

// 函数(f:(Double) => Double)、变量、预测值a:Double进行分离

def
SQ2(f:(Double) => Double)(a:Double)={

def
inSQ(guess:Double):Double={

val
next = f(guess)//

if
(accuracy(guess,next)) inSQ(next)

next

}

inSQ(a)

}

//定义函数

def
two(b:Double)=SQ2(a=>(a+b/a)/
2)(
1)

//判断语句定义函数

// def accuracy(b:Double,next:Double) = (b-next * next > 0.001 || next*next-b > 0.001)

def
accuracy(guess:Double,next:Double) = (guess-next >
0.001
)

val
m3
=
two(2
)

def
main(args: Array[String
]) {

// println(m)

// println(m2)

println(
m3)

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: