DeepRecursiveFunction所在位置是kotlin.DeepRecursiveFunction,其相关用法介绍如下。

用法:

class DeepRecursiveFunction<T, R>

定义将堆栈保留在堆上的深度递归函数,这允许不使用实际调用堆栈的非常深度的递归计算。要启动对此深度递归函数的调用,请使用其invoke 函数。根据经验,如果递归超过一千次调用,则应该使用它。

DeepRecursiveFunction 采用 T 类型的一个参数并返回 R 类型的结果。 block 代码定义了递归函数的主体。在此块中,callRecursive 函数可用于对声明的函数进行递归调用。 DeepRecursiveFunction 的其他实例也可以使用callRecursive 扩展名在此范围内调用。

例如,看看下面的递归树类和这个树的深度递归实例,它有 100K 个节点:

class Tree(val left: Tree? = null, val right: Tree? = null)
val deepTree = generateSequence(Tree()) { Tree(it) }.take(100_000).last()

可以定义一个常规递归函数来计算树的深度:

fun depth(t: Tree?): Int =
    if (t == null) 0 else max(depth(t.left), depth(t.right)) + 1
println(depth(deepTree)) // StackOverflowError

如果为 deepTree 调用此 depth 函数,由于深度递归,它会生成 StackOverflowError。但是,depth 函数可以通过以下方式使用DeepRecursiveFunction 重写,然后成功计算 depth(deepTree) 表达式:

val depth = DeepRecursiveFunction<Tree?, Int> { t ->
    if (t == null) 0 else max(callRecursive(t.left), callRecursive(t.right)) + 1
}
println(depth(deepTree)) // Ok

深度递归函数也可以通过callRecursive扩展使用堆栈的堆相互调用。例如,以下一对相互递归函数计算树中偶数深度处的树节点数。

val mutualRecursion = object {
    val even: DeepRecursiveFunction<Tree?, Int> = DeepRecursiveFunction { t ->
        if (t == null) 0 else odd.callRecursive(t.left) + odd.callRecursive(t.right) + 1
    }
    val odd: DeepRecursiveFunction<Tree?, Int> = DeepRecursiveFunction { t ->
        if (t == null) 0 else even.callRecursive(t.left) + even.callRecursive(t.right)
    }
}

参数

T- 函数参数类型。

R- 函数结果类型。

block- 函数体。