В конечном итоге я хочу взять это:
2x + 3 = 5
и вычислите для x, сначала вычтите 3 с обеих сторон так, чтобы 2x = 2
, затем разделите обе стороны на 2, чтобы x = 1
. Я много думал о том, как сделать такую функцию в JavaScript, которая может возвращать массив шагов, выполненных по порядку, включая результат. Очевидно, что «eval» ничего для этого не сделает, поэтому, похоже, нужно заново создавать уравнения.
Сначала я подумал, прежде всего, игнорировать X и просто попытаться создать функцию, которая может решать простые уравнения, без eval или какой-либо встроенной функции.
Я подумал, что первый шаг - разбить термины с помощью .split, но у меня возникли некоторые проблемы с этим, так как мне нужно разделить для несколько символов. Например, скажем, у меня есть простое выражение для оценки: 3 - 6 * 3 / 9 + 5
. Поэтому, прежде чем мы перейдем к порядку операций, просто разбить каждый термин (и классифицировать их) - это сложная часть, , которая является основным конкретным вопросом, который у меня есть на данный момент.
Я начал просто разбивать одну за другой, но у меня были некоторые проблемы, особенно учитывая порядок.
function solve(eq) {
var minuses = eq.split("-"),
pluses = minuses.map(x=> x.split("+")),
timeses = pluses.map(x=>x.map(y=>y.split("*"))),
dividers = timeses.map(x=>x.map(y=>y.map(z=>z.split("/"))));
console.log(minuses, pluses, timeses, dividers);
}
solve("3 - 6 * 3 / 9 + 5");
Как видите, для каждого последующего оператора мне нужно отобразить каждый из элементов предыдущего, чтобы разделить его, а затем у меня остается массив массивов и т. Д. *
Итак 1) как я могу более эффективно разделить эти термины , не создавая новую переменную для каждого, и вручную рекурсивно отображая каждое из них? Похоже, у меня просто должен быть какой-то словарь массива, отслеживающий порядок операций (без учета скобок или показателей): ["*","/","+","-"]
- и, учитывая этот массив, сгенерировать что-то похожее на последний массив в приведенном выше примере («делители») ") который содержит только константы и каким-то образом отслеживает, за какими элементами следует каждый из хранимых массивов ...
и 2) Как мне решить выражение для массивов значений?
Я просто немного запутался с логикой, наверное, мне нужно поработать с последним массивом и решать константы по одному, отслеживая, какой оператор является текущим, но я не уверен, как точно.