Какое минимальное количество операторов case (или if / else) требуется для вычисления всех неизвестных значений, соответствующих свойствам объекта? - PullRequest
0 голосов
/ 09 января 2019

Рассмотрим прямоугольный треугольник, который обладает свойствами

  • Гипотенуза (сторона)
  • Смежный (боковой)
  • Противоположность (сторона)
  • Область

triangles

Учитывая любые 2 из этих свойств, всегда можно вычислить значение другого 2. Мой вопрос касается того, каков наиболее эффективный / элегантный способ сделать это.

В настоящее время единственный способ сделать это, о котором я могу подумать, - это использовать (4C2) * 2 = 12 операторов case, каждое из которых относится к возможной комбинации входных данных, которые могут быть предоставлены.

Например, используя python, вы можете получить что-то вроде

class RightAngleTriangle():
    def __init__(this, propertyType1, propertyValue1, propertyType2, propertyValue2):
        this.adjacent = 0
        this.opposite = 0
        this.hypotenuse = 0
        this.area = 0
    if (propertyType1 == "adjacent" and propertyType2 == "opposite"):
        this.adjacent = propertyValue1
        this.opposite = propertyValue2
        this.hypotenuse = (propertyValue1**2 + propertyValue2**2)**0.5
        this.area = (propertyValue1 * propertyValue2)/2
    elif (propertyType1 == "opposite" and propertyType2 == "adjacent"):
        this.adjacent = propertyValue2
        this.opposite = propertyValue1
        this.hypotenuse = (propertyValue1**2 + propertyValue2**2)**0.5
        this.area = (propertyValue1 * propertyValue2)/2
    elif (propertyType1 == "adjacent" and propertyType2 == "hypotenuse"):
        this.adjacent = propertyValue1
        this.hypotenuse = propertyValue2
        this.opposite = (propertyValue2**2 + propertyValue1**2)**0.5
        this.area = (this.opposite * this.adjacent)/2

... и так далее ...

Затем вы можете создать свой треугольный объект и распечатать его четыре свойства, используя код (в данном случае python), как показано ниже.

t1 = RightAngleTriangle("adjacent", 10, "opposite", 12)
print(t1.adjacent)
print(t1.opposite)
print(t1.hypotenuse)
print(t1.area)

Это отвратительно. Есть ли более подходящее решение этой проблемы?

1 Ответ

0 голосов
/ 09 января 2019

Да, по крайней мере, два - один с использованием аргументов args и один с использованием аргументов ключевых слов. Итак:

class RightAngleTriangle():
    def __init__(self, *args):
        self.adjacent = 0
        self.opposite = 0
        self.hypotenuse = 0
        self.area = 0
        for property_type, property_value in zip(args[::2], args[1::2]):
            setattr(self, property_type, property_value)
        if not self.adjacent:
           # calculate
        elif not self.opposite:
           # calculate
        elif not self.hypotenuse:
           # calculate
        self.area = (this.opposite * this.adjacent) / 2

Это будет работать с вашим текущим вводом, но давайте согласимся - это все еще не очень элегантное решение. Итак, давайте использовать kwargs:

class RightAngleTriangle():
    def __init__(self, adjacent=0, opposite=0, hypotenuse=0):
        self.adjacent = adjacent
        self.opposite = opposite
        self.hypotenuse = hypotenuse
        self.area = 0
        if not self.adjacent:
           # calculate
        elif not self.opposite:
           # calculate
        elif not self.hypotenuse:
           # calculate
        self.area = (this.opposite * this.adjacent) / 2

И теперь вы можете просто назвать этот код как: t1 = RightAngleTriangle(adjacent=10, opposite=12)

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