Kotlin基础 (三)
21_kotlin函数和函数式表达式
fun main(args: Array<String>) {
var result = add(3, 5)
println(result)
// 函数式的声明的第一种写法
// 定义一个 x,y,返回值为 x + y
// 和 add方法是一样的
// { x: Int, y: Int -> x + y } 把一个函数表达式赋给变量 i ( i 就是函数)
var i = { x: Int, y: Int -> x + y }
var result2 = i(3, 5)
println(result2)
// 函数式的声明的第二种写法
var j: (Int, Int) -> Int = { x, y -> x + y }
var result3 = j(3,9)
println(result3)
}
// 如果 { } 里只有一行代码可以去掉 {}
//fun add(x:Int,y:Int):Int{
// return x+y
//}
// { } 中只有一行代码可以 如下这么写
fun add(x: Int, y: Int): Int = x + y
22_kotlin默认参数和具名参数
默认参数:
val Pi = 3.14159f
pi: Float = Pi
具名参数:
// 第一个参数已经知道值了(因为已经定义成常量了)
// 所以第二个参数要使用具名参数 radius = 2.0f
// 默认参数和具名参数
// 因为 pi 是不变的 所以定义成常量
val Pi = 3.14159f
// 获取长方形面积
fun rectanglearea(long: Float, wide: Float): Float {
// 长 * 宽
return long * wide
}
// 获取圆的周长(第一种方法 半径)
// 默认参数:pi: Float = Pi
fun circumferenceofacircle(pi: Float = Pi, radius: Float): Float {
// 2 * PI * 半径
return 2 * pi * radius
}
// 获取圆的周长(第二种方法 直径)
// 默认参数:pi: Float = Pi
fun circumferenceofacircle2(pi: Float = Pi, diameter: Float): Float {
// PI * 直径
return pi * diameter
}
// 获取圆柱体体积
// 默认参数:pi: Float = Pi
fun cylindervolume(pi: Float = Pi, radius: Float, high: Float): Float {
// PI * 半径 * 半径 * 高
return pi * radius * radius * high
}
// 球体表面积
// 默认参数:pi: Float = Pi
fun spheresurfacearea(pi: Float = Pi, radius: Float): Float {
// 4 * PI * 半径
return pi * radius * radius * 4
}
fun main(args: Array<String>) {
// 获取长方形面积
var area = rectanglearea(3.0f, 2.0f)
println("长方形面积=" + area)
// 获取圆的周长(使用半径)
// 第一个参数已经知道值了(因为已经定义成常量了)
// 所以第二个参数要使用具名参数 radius = 2.0f
var area1 = circumferenceofacircle(radius = 2.0f)
println("圆的周长=" + area1)
// 获取圆的周长(使用直径)
var area2 = circumferenceofacircle2(diameter = 4.0f)
println("圆的周长=" + area2)
// 球体表面积
var area3 = spheresurfacearea(radius = 2.0f)
println("球体表面积=" + area3)
}
23_kotlin字符串和数字之间的转换(没有找到)
24_kotlin人机交互
从键盘接收数字 进行计算并打印出来
// 从键盘接收数字 进行计算并打印出来
fun main(args: Array<String>) {
println("请输入第一个数字:")
// 获取用户输入的第一个数字(从键盘上接收一个数字)
// 键盘输入的都为 字符串 类型
var num1str = readLine()
println("请输入第二个数字:")
var num2str = readLine()
// 因为 键盘输入的都为 字符串 类型,所以要转成 Int类型
// 为什么不写 num1str?.toInt() 呢?
// 因为如果输入进来的值为空的话,那么最终这个返回值为空,空和空是不可以相加的
// num1str!!.toInt() : 两个 !! 代表确保输入进来的数据不为空
var num1: Int = num1str!!.toInt()
var num2: Int = num2str!!.toInt()
println("${num1}+${num2}=${num1 + num2}")
}
需要注意的点:
// 获取用户输入的第一个数字(从键盘上接收一个数字)
// 键盘输入的都为 字符串 类型
var num1str = readLine()
// 因为 键盘输入的都为 字符串 类型,所以要转成 Int类型
为什么不写 num1str?.toInt() 呢?
// 因为如果输入进来的值为空的话,那么最终这个返回值为空,空和空是不可以相加的
// num1str!!.toInt() : 两个 !! 代表确保输入进来的数据不为空
var num1: Int = num1str!!.toInt()
var num2: Int = num2str!!.toInt()
25_kotlin异常处理(没有找到)
26_kotlin递归
100的阶乘为什么是 0 ?
用Int类型去装
// 演示递归
// 递归最经典的用法为:计算阶乘
// 1的阶乘:1 2的阶乘:2 * 1 3的阶乘:3 * 2 * 1
// n 的 阶乘是多少?
fun main(args: Array<String>) {
var num = 100
// 计算 100 的阶乘
println(fact(num))
}
// 5 的阶乘 相当于用 5 去乘 4 的阶乘
// 阶乘函数
fun fact(num: Int): Int {
if (num == 1) {
return 1
} else {
return num * fact(num - 1)
}
}
输出结果为 0
用Long类型去装
// 演示递归
// 递归最经典的用法为:计算阶乘
// 1的阶乘:1 2的阶乘:2 * 1 3的阶乘:3 * 2 * 1
// n 的 阶乘是多少?
fun main(args: Array<String>) {
var num = 100L
// 计算 100 的阶乘
println(fact(num))
}
// 5 的阶乘 相当于用 5 去乘 4 的阶乘
// 阶乘函数
fun fact(num: Long): Long {
if (num == 1L) {
return 1
} else {
return num * fact(num - 1)
}
}
输出结果为 0
因为**100的阶乘是十分大的数,这个数已经超过了Int的最大长度,也超过了Long的最大长度**
解决方法 使用 BigInteger 去接收 100 的阶乘
使用 BigInteger 计算 100 的阶乘
import java.math.BigInteger
// 演示递归
// 递归最经典的用法为:计算阶乘
// 1的阶乘:1 2的阶乘:2 * 1 3的阶乘:3 * 2 * 1
// n 的 阶乘是多少?
fun main(args: Array<String>) {
var num = BigInteger("100")
// 计算 100 的阶乘
println(fact(num))
}
// 5 的阶乘 相当于用 5 去乘 4 的阶乘
// 阶乘函数
fun fact(num: BigInteger): BigInteger {
if (num == BigInteger.ONE) {
return BigInteger.ONE
} else {
return num * fact(num - BigInteger.ONE)
}
}
27_kotlin尾递归优化
如果执行 100000 的累加会报 StackOverflowError(堆栈溢出) 的错误 (因为在达到一定的累加次数操作后还需要进行重复的累加操作就会报错)
// 尾递归优化
// 累加操作(利用递归)
// 1的累加1 2的累加就是=2+1 3的累加=3+2+1 4的累加=4+3+2+1
// n的累加?
fun main(args: Array<String>) {
println(ollAdd(100000))
}
fun ollAdd(num: Int): Int {
// 输出计算器最大可以运行几次
println("计算机第${num}次运算")
if (num == 1) {
return 1
} else {
return num + ollAdd(num - 1)
}
}
上面的练习代码会报错(StackOverflowError(堆栈溢出)
如果想累加到 100000 的话,用Java语言是不可以执行到的,如果用kotlin的话需要用到 尾递归优化
尾递归的代码块
// 在这里加上关键字 tailrec 就可以进行 尾递归优化
tailrec fun ollAdd(num: Int, result: Int): Int {
// 输出计算器最大可以运行几次
println("计算机第${num}次运算,result=${result}")
if (num == 0) {
return 1
} else {
// 如果想让计算机做尾递归优化的话,要求函数的返回值(return)应该调用的是函数本身(用 result + num 来存储数据)
return ollAdd(num - 1, result + num)
}
}
练习代码
// 尾递归优化
// 累加操作(利用递归)
// 1的累加1 2的累加就是=2+1 3的累加=3+2+1 4的累加=4+3+2+1
// n的累加?
fun main(args: Array<String>) {
var result = 0
println(ollAdd(100000, result))
}
// 在这里加上关键字 tailrec 就可以进行 尾递归优化
tailrec fun ollAdd(num: Int, result: Int): Int {
// 输出计算器最大可以运行几次
println("计算机第${num}次运算,result=${result}")
if (num == 0) {
return 1
} else {
// 如果想让计算机做尾递归优化的话,要求函数的返回值(return)应该调用的是函数本身(用 result + num 来存储数据)
return ollAdd(num - 1, result + num)
}
}
28_kotlin新的篇章idea使用入门
29_kotlin面向对象入门
如果描述的类型不是基本类型怎么办?
任何复杂的数据类型都是由基本的数据类型组成的
面向对象(一)
用基本的数据类型描述复杂的事物
描述矩形
// 描述矩形 高 宽
// 创建新的数据类型 用 class
class Rect(var height: Int, var width: Int)
fun main(args: Array<String>) {
// 定义一个矩形
var rect01 = Rect(20, 10)
println("矩形的高度:${rect01.height}")
println("矩形的宽度:${rect01.width}")
}
描述矩形
// 描述 一个 妹子 长相 声音
class Girl(var chactor:String , var voice:String)
fun main(args: Array<String>) {
var girl1 = Girl("彪悍","甜美")
println("girl1这位妹子的声音:${girl1.voice}")
}
30_kotlin静态属性和动态行为
面向对象(二)
对象具有行为
// 定义动态行为(方法:可以哭可以笑)
fun smile(){
println("妹子笑了一下!")
}
fun cry(){
println("人家伤心了!")
}
对象具有属性
// 静态属性:性格和声音 var chactor: String, var voice: String
var chactor: String, var voice: String
练习代码:
// 描述 一个 妹子 长相 声音
// 静态属性:性格和声音 var chactor: String, var voice: String
class Girl(var chactor: String, var voice: String) {
// 定义动态行为(方法:可以哭可以笑)
fun smile(){
println("妹子笑了一下!")
}
fun cry(){
println("人家伤心了!")
}
}
fun main(args: Array<String>) {
var girl1 = Girl("彪悍", "甜美")
println("girl1这位妹子的声音:${girl1.voice}")
girl1.cry()
girl1.smile()
}