【问题标题】:Kotlin: Recursion using "when"Kotlin:使用“何时”进行递归
【发布时间】:2020-04-26 10:33:50
【问题描述】:

我一直在尝试在 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)

它返回:

CAMARA
kotlin.Unit
kotlin.Unit
kotlin.Unit

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

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

【问题讨论】:

  • 您的 else 分支正在运行,您正在打印递归调用的返回值。
  • 因为void 隐式返回Unit
  • 将 else 分支更改为 else -> pick(Random.nextBoolean(), Random.nextBoolean())

标签: kotlin recursion


【解决方案1】:

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

一样
fun pick(camara: Boolean, klinga: Boolean): Unit {...}

可能的解决方案:

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)
}

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))
}

tailrec 用于优化Tail recursive functions

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 2018-11-02
    • 2015-02-02
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多