Kotlin中的递归匿名函数

时间:2018-07-08 15:11:46

标签: recursion kotlin anonymous-function

我正在执行此匿名功能,我需要它来调用自身。有什么办法吗?我尝试了下面的代码,但没有用...

val example:Char = fun () : Char { 
    //Some code
    if(condition) {
        return this();
    } 
}

我应将'this()'替换为什么? 对Kotlin来说,我还很陌生,因此对回复很有帮助

3 个答案:

答案 0 :(得分:1)

您无法在Kotlin中命名匿名函数(使用此语法或lambda),因此也不能使它们递归,因为您知道引用自身的方法。

如果需要递归,则必须创建一个常规函数,然后调用该函数:

fun helper() : Char {
     if (condition) {
        return helper();
    }
    ...
}

val example = helper()

好消息是,您基本上可以在any scope中创建一个常规的命名函数。它们可以是类之外的顶级类,类成员,也可以是嵌套在其他函数中的局部函数。只要您可以写下val example = ...,就可以创建一个函数。

答案 1 :(得分:1)

调用匿名函数听起来很复杂,因为没有名称可以用:)来调用它 当我目前正在自己​​学习Kotlin时,我尝试了一些方法并提出了这一建议,希望对您有所帮助:

import kotlin.test.Test
import kotlin.test.assertEquals

class StackOverflow51233329 {

    @Test
    fun test() {
        var letter = 'A'

        lateinit var example: () -> Char

        example = {
            letter++   
            if (letter >= 'C') letter else example()
        }

        assertEquals('C', example())
    }
}

答案 2 :(得分:0)

如果要避免使用lateinit,则可以使用Y combinator,它可以在无法直接进行递归的情况下启用递归。在全球范围内声明:

class RecursiveFunc<T, R>(val f: (RecursiveFunc<T, R>) -> (T) -> R)

fun <T, R> y(f: ((T) -> R) -> (T) -> R): (T) -> R {
    val rec = RecursiveFunc<T, R> { r -> f { r.f(r)(it) } }
    return rec.f(rec)
}

此代码取自Rosetta Code。您可以这样使用它:

val fac = y { f: ((Int) -> Int) ->
    { n: Int ->
        if (n <= 1) 1 else n * f(n - 1)
    }
}
println(fac(10))

f是此处的递归函数,其签名为(Int) -> Int。该函数的其余部分与往常几乎相同,只是形式为lambda。您甚至可以使用更常用的函数语法:

val fac = y { f: (Int) -> Int ->
    fun(n: Int): Int {
        return if (n <= 1) 1 else n * f(n - 1)
    }
}