Kotlin:使用“when”的递归

Gab*_*abe 1 recursion kotlin

我一直在尝试在 Kotlin 中使用“when”进行递归,事实上,它有效,但它也给了我一些带有 void 数据类型的奇怪输出,在 Kotlin 中称为 Unit,“when”语句如何工作?它必须返回一些东西吗?

fun pick(camara: Boolean, klinga: Boolean){
    when {
         camara -> println("KLINGA")
         klinga -> println("CAMARA")
         else -> println(pick(Random.nextBoolean(), Random.nextBoolean()))
    }
}    

pick(false, false)
Run Code Online (Sandbox Code Playgroud)

它返回:

CAMARA
kotlin.Unit
kotlin.Unit
kotlin.Unit
Run Code Online (Sandbox Code Playgroud)

递归正确进行,但它也输出空数据(可能对应于递归调用的次数)

那么问题来了,为什么会出现这样的输出呢?是因为“when”返回的是函数调用的返回值吗?在这种情况下单位?

IR4*_*R42 5

不返回任何内容的函数实际上返回Unit. 你的功能与

fun pick(camara: Boolean, klinga: Boolean): Unit {...}
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

tailrec fun pick(camara: Boolean, klinga: Boolean) {
    when {
        camara -> println("KLINGA")
        klinga -> println("CAMARA")
        else -> pick(Random.nextBoolean(), Random.nextBoolean())
    }
}

fun main() {
    pick(false, false)
}
Run Code Online (Sandbox Code Playgroud)

或者

tailrec fun pick(camara: Boolean, klinga: Boolean): String = 
    when {
        camara -> "KLINGA"
        klinga -> "CAMARA"
        else -> pick(Random.nextBoolean(), Random.nextBoolean())
    }

fun main() {
    println(pick(false, false))
}
Run Code Online (Sandbox Code Playgroud)

tailrec用于尾递归函数的优化