Logo
Section 1 / 7

基本函数

学习如何将代码块模块化为函数,以及如何在 Kotlin 中调用函数。理解函数签名与函数声明之间的区别。

检查点

基本函数

学习如何将代码块模块化为函数,以及如何在 Kotlin 中调用函数。理解函数签名与函数声明之间的区别。

函数将有用的代码块封装成一个命名实体,你可以在代码中引用它。与变量一起,它们是避免代码重复的最基本语言构造。

函数签名

函数签名 定义了函数的名称、输入参数和返回值。在 Kotlin 中,其形式如下:

1fun fibonacci(index: Int): Long

该签名定义了一个名为 fibonacci 的函数,它有一个类型为 Int 的输入参数 index,并返回一个类型为 Long 的值。换句话说,你传入一个整数,函数会返回一个 Long 类型的结果。这个函数实现了著名的斐波那契数列。

声明函数

在函数声明中,必须同时包含函数签名和函数体:

1fun fibonacci(index: Int): Long { 2 return if (index < 2) { 3 1 4 } else { 5 fibonacci(index-2) + fibonacci(index-1) // 递归调用 fibonacci 函数 6 } 7}

函数体是一个代码块(因此用大括号包围),用于定义函数的具体行为。return 关键字用于指定函数调用的返回值。

注意: 注意 return 关键字被移到了条件块之外。这是可行的,因为 if 块是一个表达式,因此具有一个值。

调用函数

一旦声明了函数,就可以通过为每个必需的输入参数传递值来调用它:

1val output = fibonacci(6) 2println(output)

这个函数调用 将 index 参数设为 6,并使用该输入运行函数。对于 output 变量,Kotlin 编译器会根据函数的返回类型推断出其类型为 Long。

函数类型

Kotlin 中的函数具有明确的类型。例如,fibonacci 函数的类型是 (Int) -> Long,表示它接受一个 Int 作为输入并返回一个 Long。换句话说,它是一个“从 Int 到 Long 的函数”。 当你进入 Kotlin 的函数式编程时,这一概念变得尤为重要。

测验

练习

此时,你已经掌握了足够的概念,可以解决基础的算法练习题。这类练习是真正掌握语言并自信使用它的最有效方式。

注意: 本课包含多个练习,这些练习可能比之前课程中的练习花费更长时间。

这是因为你现在已具备解决实际计算问题的能力。请花时间完成这些练习,为后续课程打下坚实的基础。

乘法表

实现一个函数,用于打印乘法表。该函数接收两个范围作为输入:一个用于行,一个用于列。

调用你的函数,打印行范围为 1..5、列范围为 1..8 的乘法表。

问题

1// 在此处添加你的代码

解答

1fun printMultiplicationTable(rows: IntRange, columns: IntRange) { 2 for (row in rows) { 3 for (col in columns) { 4 System.out.format("%-8d", row * col) 5 } 6 println() 7 } 8} 9 10printMultiplicationTable(1..5, 1..8)

提示:

  • 使用 IntRange 类型作为输入参数
  • 可以使用标准库函数 System.out.format("%-8d", value) 来输出左对齐且宽度为 8 字符的值。这在打印整齐表格时是必要的。

最大公约数

编写一个函数,计算两个给定整数的最大公约数(GCD)。调用该函数分别求出 (54, 24)、(81, 153) 和 (137, 73) 的最大公约数。

问题

1// 在此处添加你的代码

解答

1fun gcd(a: Int, b: Int): Int { 2 if (a == 0) { 3 return b 4 } 5 return gcd(b % a, a) 6} 7 8println(gcd(54, 24)) 9println(gcd(81, 153)) 10println(gcd(137, 73))

预期输出:

  • gcd(54, 24) = 6
  • gcd(81, 153) = 9
  • gcd(137, 73) = 1

最小公倍数

编写一个函数,计算两个给定整数的最小公倍数(LCM)。通过调用该函数并使用多个示例输入进行验证。尝试变化输入并探索边界情况(例如当 lcm(a, b) == a、lcm(a, b) == b 或 lcm(a, b) == a*b 时的情况)。

问题

1// 在此处添加你的代码

解答

1// 我们将在下面重用 gcd 函数,因此需要先定义它 2fun gcd(a: Int, b: Int): Int { 3 if (a == 0) { 4 return b 5 } 6 return gcd(b % a, a) 7} 8 9// 解答 10fun lcm(a: Int, b: Int): Long = a.toLong() * b / gcd(a, b) 11 12println(lcm(54, 1)) 13println(lcm(1, 24)) 14println(lcm(3, 7))

提示:可以通过最大公约数来计算最小公倍数,因此你可以复用之前编写的 GCD 函数。

总结

函数可能是你需要理解的最重要概念之一,因为它们是你代码的主要构建模块。日常编程大多涉及添加、拆分、删除以及以其他方式操作函数。

  • Kotlin 使用 fun 关键字来定义函数。
  • 函数由函数签名和函数体组成。
    • 签名定义了函数的名称、参数和返回类型。
    • 函数体定义了函数的具体行为。
  • Kotlin 中的函数具有明确的类型,包含参数类型和返回类型。

在下一课中,你将学习如何编写自己的 main() 函数,以创建可执行的 Kotlin 文件。到目前为止,这部分代码一直隐藏在示例代码中,以便于你学习。

Quiz

Single Choice

以下哪个是 Kotlin 中有效的函数签名?

1 / 3

循环

main() 函数