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)
}
}
參數
相關用法
- Kotlin DeepRecursiveFunction.<init>用法及代碼示例
- Kotlin Delegates.notNull用法及代碼示例
- Kotlin Delegates.vetoable用法及代碼示例
- Kotlin Delegates.observable用法及代碼示例
- Kotlin Double.dec用法及代碼示例
- Kotlin Duration.toString用法及代碼示例
- Kotlin Duration.parseIsoStringOrNull用法及代碼示例
- Kotlin Duration.parseOrNull用法及代碼示例
- Kotlin Duration.toIsoString用法及代碼示例
- Kotlin Duration.parseIsoString用法及代碼示例
- Kotlin Duration.parse用法及代碼示例
- Kotlin Double.inc用法及代碼示例
- Kotlin DoubleStream.toList用法及代碼示例
- Kotlin DoubleStream.asSequence用法及代碼示例
- Kotlin associateBy用法及代碼示例
- Kotlin all用法及代碼示例
- Kotlin map用法及代碼示例
- Kotlin filterNot用法及代碼示例
- Kotlin reduceRight用法及代碼示例
- Kotlin Random.Default用法及代碼示例
- Kotlin Byte.inc用法及代碼示例
- Kotlin getValue用法及代碼示例
- Kotlin windowedSequence用法及代碼示例
- Kotlin contentToString用法及代碼示例
- Kotlin groupByTo用法及代碼示例
注:本文由純淨天空篩選整理自kotlinlang.org大神的英文原創作品 kotlin.DeepRecursiveFunction。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。