Правильно ли это однострочник для вычисления среднего числа между a, b и c?

Примечание. Я не хочу вычислять среднее значение, а только среднее, если эти 3 были упорядочены от наименьшего до наибольший (средний).

Пример: среднее значение 1 , 77 и 34 равно 34 .

public static int midpoint(int a, int b, int c) {

    return a <= b ? (c <= a ? a : c <= b ? c : b ) : c <= b ? b : c <= a ? c : a;
}
-1
j1nma 24 Апр 2017 в 05:18

2 ответа

Правильно ли это в одной строке?

Давайте пройдем через это:

return a <= b ? (c <= a ? a : c <= b ? c : b ) : c <= b ? b : c <= a ? c : a;

Предположим, что <= b. Тогда, если c <= a, вернуть a. Таким образом, c <= a <= b и a - правильная вещь для возврата. С другой стороны, если c <= b, то c <= b

Теперь предположим, что a <= b ложно - тогда b> a. Теперь, если c <= b, у нас есть c <= b b и b> a, поэтому мы вернем a. Обратите внимание, что у вас есть дополнительное сравнение. (мы уже знаем, что b> a, и мы только что узнали, что c> b, что дает нам порядок)

Обратите внимание на две вещи в этом однострочнике: хотя выяснилось, что ваша логика была правильной, определить правильность было трудно и отнимало много времени, и она не масштабируется (представьте, что однострочник для пяти элементов ...)

Правильный подход - отсортировать список и взять средний элемент.

(это именно то, что вы просили: «только тот, который находится посередине, если эти 3 были упорядочены от наименьшего к наибольшему».)

1
Jon Kiparsky 24 Апр 2017 в 02:50
Math.max(Math.min(a, b), Math.min(Math.max(a, b), c));

Работает на все случаи.

0
j1nma 24 Апр 2017 в 02:35