Я пытаюсь запустить рекурсивную функцию в фоновом потоке и иметь возможность отменить ее и перезапустить, когда пользователь нажимает кнопку. Я прочитал некоторые основы сопрограмм, но до сих пор не освоился. Может ли кто-нибудь предложить лучшее решение?
Кроме того, я пытаюсь выбрать между двумя версиями рекурсивной функции. Один возвращает свое значение через стек, а другой просто обновляет свойство класса без возврата. Кажется, оба работают правильно, а второй завершается немного быстрее.
Есть ли какие-либо проблемы при запуске рекурсивной функции без возвратов?
Вот мой код. Он компилируется и правильно работает в эмуляторе Android (конечно, мне нужно нажать «Подождать» во всплывающем окне ANR).
Образец данных заканчивается примерно через 95 или 91 секунду. В действительности список может содержать любое количество элементов, каждый из которых имеет список любого количества целых чисел.
Намерение состоит в том, чтобы пользователь отправил набор данных для расчета вероятностей. . Функция (на данный момент) подсчитывает общее количество возможных комбинаций. Пользователю не нужно ждать завершения расчета, прежде чем нажать кнопку, чтобы отправить новый набор данных, что должно отменить текущее задание (если оно существует) и начать заново с новым набором данных.data class Item(var numbers: List)
class CalcEngine(
) {
val data: List = listOf(
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
Item( listOf(1,2,3,4,5,6,7,8,9,10,11,12) ),
)
fun calculate() {
val time1 = measureTimeMillis {
Log.d(TAG, "starting countWithReturn()...")
Log.d(TAG, "count: ${countWithReturn()}")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time1 / 1000L }s.")
// sample data finishes in 95s.
Log.d(TAG, "")
testCount = 0UL
val time2 = measureTimeMillis {
Log.d(TAG, "starting countNoReturn()...")
countNoReturn()
Log.d(TAG, "count: $testCount")
Log.d(TAG, "done.")
}
Log.d(TAG, "Completed in ${time2 / 1000L }s.")
// sample data finishes in 91s.
Log.d(TAG, "===================================")
Log.d(TAG, "")
}
fun countWithReturn(index: Int = 0): ULong {
if(index == data.size - 1 ) {
var count = 0UL
for(i in 0..
Подробнее здесь: https://stackoverflow.com/questions/792 ... -so-that-i
Как лучше всего использовать рекурсивную функцию в сопрограмме Kotlin, чтобы ее можно было отменить и перезапустить? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Создайте синтаксический анализатор, используя рекурсивную функцию [закрыто]
Anonymous » » в форуме C++ - 0 Ответы
- 84 Просмотры
-
Последнее сообщение Anonymous
-