Как я могу проверить, находится ли элемент в наборе с функцией более высокого порядка - PullRequest
0 голосов
/ 25 февраля 2019

Я боролся с упражнением в течение нескольких часов, поэтому я ищу помощь.

Я должен переписать эту функцию:

def is_in(eq,e,E):
    """ (alpha*alpha -> bool) * alpha * list[alpha] -> bool
    Return True if e is equal to one element of E according to eq"""
    if len(E)==0:
        return False
    elif eq(e,E[0]):
        return True
    else:
        return is_in(eq,e,E[1:])

is_in проверяет, еслиэлемент находится в наборе (представлен в виде списка).Дело в том, что два элемента могут быть «одинаковыми», но оператор == вернет false (например, мы считаем, что [0,1] и [1,0] одинаковы)

Кроме того, чтобы сделать is_in, я должен использовать функцию, которую я сделал ранее:

def exists(L, p):
    """ list[alpha] * (alpha -> bool) -> bool
    Return True if at least one element x of L is such as p(x)==True"""

    for a in L:
        if p(a):
            return True
    return False

Мы только начали изучать функции более высокого порядка, поэтому мне удалось написать несколько, но не эту.

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Тебе это не нужно.Это однострочник: просто напрямую return (e in E):

def is_in(e, E):
    return (e in E)

zoo = ['ant','bat','cat','dog','eel']

>>> is_in('fox', zoo)
False
>>> is_in('cat', zoo)
True
>>> is_in('caterpillar', zoo)
False

Нет необходимости в рекурсии.Нет необходимости проверять угловой регистр длины 0, тестирование e in E также с этим справится и тривиально возвращает False.

(Кстати, вы также можете использовать in как с наборами, так и со списками. Python имеетset() тип.)

0 голосов
/ 25 февраля 2019

Хорошо, поэтому я попытался сделать то, что сказал мне @chepner

def is_in(eq, e, E):
    """ (alpha * alpha -> bool) * alpha * list[alpha] -> bool
    Retourne True si e est égal selon eq à un élément de E"""

    if len(E)==0:
        return False
    else:
        def _eq(x):
            for i in E:
                if eq(x, i):
                    return True
            return False
        return exists(E, _eq(e))

Вам это кажется правильным?

РЕДАКТИРОВАТЬ: Хорошо, я думаю, у меня есть решение для этого:

def is_in(eq, e, E):
    """ (alpha * alpha -> bool) * alpha * list[alpha] -> bool
    Retourne True si e est égal selon eq à un élément de E"""

    def _eq(x):
        return eq(x, e)
    return exists(E, _eq)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...