Я пытаюсь запустить рекурсивную функцию в фоновом потоке и иметь возможность отменить ее и перезапустить, когда пользователь нажимает кнопку. Я прочитал некоторые основы сопрограмм, но до сих пор не освоился. Может ли кто-нибудь предложить лучшее решение?
Кроме того, я пытаюсь выбрать между двумя версиями рекурсивной функции. Один возвращает свое значение через стек, а другой просто обновляет свойство класса без возврата. Кажется, оба работают правильно, а второй завершается немного быстрее.
Есть ли какие-либо проблемы при запуске рекурсивной функции без возвратов?
Вот мой код. Он компилируется и правильно работает в эмуляторе 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
Форум для тех, кто программирует под Android
1732738477
Anonymous
Я пытаюсь запустить рекурсивную функцию в фоновом потоке и иметь возможность отменить ее и перезапустить, когда пользователь нажимает кнопку. Я прочитал некоторые основы сопрограмм, но до сих пор не освоился. Может ли кто-нибудь предложить лучшее решение?
Кроме того, я пытаюсь выбрать между двумя версиями рекурсивной функции. Один возвращает свое значение через стек, а другой просто обновляет свойство класса без возврата. Кажется, оба работают правильно, а второй завершается немного быстрее.
Есть ли какие-либо проблемы при запуске рекурсивной функции без возвратов?
Вот мой код. Он компилируется и правильно работает в эмуляторе 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..
Подробнее здесь: [url]https://stackoverflow.com/questions/79231228/what-is-the-best-way-to-use-a-recursive-function-in-a-kotlin-coroutine-so-that-i[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия