Я создаю алгоритм подсчета, в котором я увеличиваю число с большими приращениями, а затем приращения уменьшаются со временем, в идеале достигая нуля или единицы. Окончательное значение суммы должно быть предопределено.Количество шагов должно быть входным параметром и может варьироваться.Кажется, что это логарифмическая функция с максимальным значением.Тем не менее, логарифмическая функция растет до бесконечности.
Лучшее, что я нашел, это квадратный корень из логарифма:
val log = (1..10).map { Math.sqrt(Math.log(it * 1.0)) }
val max = log.max()
val rounded = log.map { it * 1000 / max!! }.map { Math.round(it) }
rounded.forEachIndexed { i, l ->
if (i + 1 < rounded.size)
println("${rounded[i + 1] - rounded[i]}")
}
Тем не менее, я до сих пор не получаю очень маленькие приращения в конце,Если диапазон от нуля до 10: 549, 142, 85, 60, 46, 37, 31, 27, 23
Если диапазон равен 20: 481, 125, 74, 53, 40, 33, 27, 23, 21, 18, 16, 14, 14, 12, 11, 10, 10, 9, 9
Какой алгоритм использовать, чтобы добраться до 1 в конце?
Обновление: На основе формулы Патрика я сделал это решение:
` val N = 18981.0
val log = (1..50).map { N - N/it }
val max = log.max()
log.map { print("$it, ") }
val rounded = log.map { it * N / max!! }.map { Math.round(it) }`
Важно, чтобы N
было Double
, а не целым числом