Kotlin: рекурсия с использованием «когда» - PullRequest
0 голосов
/ 26 апреля 2020

Я пытался сделать рекурсию с «когда» в Kotlin, и действительно, это работает, но это также дает мне некоторые странные выходные данные с типом void, известным в Kotlin как Unit, как это происходит, когда «когда» Скажите работа? Должно ли оно что-то возвращать?

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

Рекурсия выполнена правильно, но также выводит пустые данные (вероятно, соответствующие количеству рекурсивных вызовов)

Итак, вопрос в том, почему появляется такой вид вывода? Это потому, что «когда» возвращает возвращаемое значение вызова функции? В этом случае Единица?

1 Ответ

4 голосов
/ 26 апреля 2020

Функции, которые ничего не возвращают, фактически возвращают 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 для оптимизации Хвостовая рекурсивная функция

...