Как я могу получить коэффициенты из полиномиального выражения? - PullRequest
0 голосов
/ 30 марта 2019

На входе я получаю полином в виде строки, например "7x ^ 4 + 3x ^ 3-6x ^ 2 + x-8" . Я хочу получить его коэффициенты в переменных, но я понятия не имею, как это сделать. Максимальная степень неизвестна, коэффициенты являются целыми числами. Также условия какой-то степени могут отсутствовать. Буду очень признателен за любую помощь.

Я попытался разделить на «+» и «-», а затем на «x ^», но у меня возникли проблемы с x , термином с (неписаной) степенью 1. Также я попытался сначала разделить на «x», затем на «^» и обработать исключение с помощью «-», но я не знаю, как обрабатывать исключение с отсутствующими градусами.

private fun koef(text: String) : List<Int> {
        val vars = text.split("x")
        val koefList = mutableListOf<Int>()
        var count = 1
        vars.forEach {
            if (it == "-") koefList.add(-1)
            else {
                if (it[0] == '^')
            }
        }
        return koefList
    }

1 Ответ

0 голосов
/ 02 апреля 2019

Вот одна из реализаций.

Это несколько более общий термин, позволяющий использовать термины в любом порядке и иметь окружающие пробелы.Но он по-прежнему предполагает, что многочлен действителен, что степени неотрицательны и все различны, и что есть хотя бы один член.

Вы не указали порядок коэффициентов, поэтому он возвращает их вувеличение мощности (начиная с x ^ 0, затем x ^ 1 и т. д.).

private fun coeffs(polynomial: String): List<Int> {
    val terms = polynomial.split(Regex("(?=[+-])")).associate{ term ->
        val s = term.split(Regex("x\\^?"))
        val coeff = s[0].replace(" ", "")
                .let{ when (it){ "", "+" -> 1; "-" -> -1; else -> it.toInt() }}
        val power = s.getOrNull(1)?.trim()
                .let{ when (it){ null -> 0; "" -> 1; else -> it.toInt() }}
        power to coeff
    }
    val highestPower = terms.keys.max()!!
    return (0..highestPower).map{ terms[it] ?: 0 }
}

Примеры результатов:

  • coeffs ("x ^ 2 + 2x-1") = [-1, 2, 1]
  • коэф. (" 2x ^ 3 - 3x ^ 4 - x + 4 ") = [4, -1, 0, 2, -3]
  • coeffs ("x") = [0, 1]
  • coeffs ("- 2") = [-2]

Он начинается с разбиения строки на термины,((?=[+-]) - это запрос, который соответствует пустой строке, если за ней следует + или -. Полная документация по регулярным выражениям Java / Kotlin: здесь .)

Itзатем разбивает каждый член на коэффициент и степень, преобразует их в числа и создает a Map от члена к коэффициенту.(Это довольно неловко, поскольку приходится обрабатывать несколько особых случаев, когда числа и / или знаки отсутствуют.) Использование карты обрабатывает недостающие способности (а также силы, которые не в порядке).

Наконец,он находит наибольшую мощность и преобразует карту в список коэффициентов с возрастающей степенью, заполняя 0 для отсутствующих степеней.

Я сохранил короткий код, чтобы показать принцип.Если он будет использоваться в производстве, вы, вероятно, должны сделать его более безопасным и более эффективным, например, путем проверки на недопустимый ввод, такой как пустая строка, недопустимые символы или дублирующиеся полномочия;и помещая Regex в свойства, чтобы их не нужно было каждый раз воссоздавать.Некоторые юнит-тесты тоже не будут плохими!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...