高阶函数应用
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)
}
}
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)
}
}
相关文章推荐
- c语言二进制文件加密
- JPA调用存储过程的方法
- 【git】删除某个文件的所有历史记录,批量删除远程分支
- C++与C的输出对齐
- Linux 技巧之 Grub 超实用技巧
- Python 虚拟环境Virtualenv
- Huffman编码与译码
- 模式匹配
- 屏蔽后退键
- [LeetCode] 129. Sum Root to Leaf Numbers 解题思路
- C++ 指数幂函数
- 153_Filptile (POJ No.3279)
- 关于我过去的一年
- NSURLSession下载的进度监测
- iOS开发实践之多线程(NSThread)
- 到小公司去
- ecshop 去版权
- java中的四种访问权限
- 控制抽象
- 专注UI——有用技术:模糊搜索