原文: https://beginnersbook.com/2019/03/kotlin-recursion-and-tail-recursion/

如果函数调用自身,则该函数称为递归函数,此过程称为递归

递归函数如何看起来像?

这里函数myfunction()调用自身,这是一个递归函数。

  1. fun myfunction(){
  2. //some code
  3. ....
  4. //myfunction() calling myfunction()
  5. myfunction()
  6. }

让我们举个例子来理解递归。

Kotlin 递归示例

这是阶乘的一个简单例子。这里我们定义了一个函数fact()来计算它作为参数传递给该函数的数字的阶乘。在函数体中我们再次调用此函数,此过程称为递归。

要求用户输入正整数,并根据输入,程序通过将输入数作为参数传递给用户定义函数fact()来查找输入数的阶乘。

  1. fun main(args: Array<String>) {
  2. print("Enter a positive integer number: ")
  3. val number: Int =Integer.valueOf(readLine())
  4. val factorial = fact(number)
  5. println("Factorial of $number = $factorial")
  6. }
  7. //recursive function
  8. fun fact(num: Int): Int {
  9. return if(num == 1){
  10. num
  11. }
  12. else{
  13. //function fact() calling itself
  14. num*fact(num-1)
  15. }
  16. }

输出:

Kotlin 递归和尾递归 - 图1

尾递归

在递归中,计算在递归调用之后完成,我们在上面看到的阶乘的例子是递归或头递归的一个例子,其中计算n的阶乘,我们需要n-1的阶乘。

尾递归中,计算在递归调用之前的开始处完成。在尾递归中,递归函数的调用发生在函数的末尾。这意味着首先完成计算,然后传递给下一个递归调用。

让我们举一个尾递归的例子。

尾递归示例

要声明尾递归函数,我们在函数之前使用tailrec修饰符。

  1. fun main(args: Array<String>) {
  2. val number = 6
  3. val factorial = fact(number)
  4. println("Factorial of $number = $factorial")
  5. }
  6. tailrec fun fact(n: Int, temp: Int = 1): Int {
  7. return if (n == 1){
  8. temp
  9. } else {
  10. fact(n-1, temp*n)
  11. }
  12. }

输出:

Kotlin 递归和尾递归 - 图2