首页 > 解决方案 > Kotlin:递归中的异常处理

问题描述

这是我的功能:

fun quickSort(data: List<PhEntry>, maxTime: Long = 0L): List<PhEntry> {
    if (System.currentTimeMillis() > maxTime) throw Exception("")
    if (data.size < 2) return data
    val pivot = data[data.lastIndex / 2]
    val equal = data.filter { it.name == pivot.name }
    val greater = data.filter { it.name > pivot.name }
    val lesser = data.filter { it.name < pivot.name }
    return quickSort(lesser, maxTime) + equal + quickSort(greater, maxTime)
}

我从计时功能中调用它:

fun sortTimer(data: List<PhEntry>, time: Long = 0L, sortFunc: (sortedData: List<PhEntry>, time: Long) -> List<PhEntry>): Pair<List<PhEntry>?, Long> {
    val startTime = System.currentTimeMillis()
    return try{
        val result = sortFunc(data, startTime + time)
        Pair(result, System.currentTimeMillis() - startTime)
    } catch (e: Exception) {
        Pair(null, System.currentTimeMillis() - startTime)
    }
}

数据是一个巨大的电话簿,包含一百万个条目。该程序应该尝试在 90 秒内对整个列表进行排序。如果不可能,那么它应该对未排序的列表进行简单的搜索。

时间值大于等于 90000L(90 秒)会导致程序冻结。它不会抛出任何异常,只是冻结。我刚刚尝试使用 1000L 作为值,time并且程序运行良好。

为什么会这样?如果达到时间限制,我想基本上终止递归。我不能使用kotlinx库,因为我正在从 hyperskill 上一门课程,而且它们不允许我修改 gradle 文件。


编辑1:

println(System.currentTimeMillis())在函数中插入 a时quickSort,函数会在System.currentTimeMillis()超过时冻结maxTime。然后什么也没有发生。此时递归非常深,这是导致这种行为的原因吗?

标签: kotlinrecursionexception

解决方案


推荐阅读