Bonne journée tout le monde. J'ai besoin d'un peu d'aide pour mes devoirs -- s'il vous plaît, ne me donnez pas la réponse ; aidez-moi à conceptualiser cela.

Je dois créer une fonction de classe qui agit comme un ensemble mathématique. Ce qui signifie qu'il peut s'agir d'un ensemble infini. La fonction de classe prend une fonction booléenne comme argument et fera un ensemble qui comprend tous les nombres naturels (y compris 0) qui correspondent à la fonction booléenne

class Infset:
    def __init__(self, f):
        self.inf = set()
        self.x = 0
        while True:
            if f(self.x) == True:
                self.inf.add(self.x)
                self.x += 1
            else:
                self.x += 1

Jusqu'à présent, j'ai créé une classe qui crée vraiment un ensemble infini qui renvoie bien sûr MemoryError.

La fonction booléenne sera donnée sous forme de fonctions lambda telles que :

lambda x: x%3==2
lambda x: x*x>5

Je dois également faire des méthodes d'opérateur telles que:

def __or__(self, other):
    return #Union of two sets

def __and__(self, other):
    return #intersection of two sets

def __sub__(self, other):
    return #difference of two sets

Qui renvoie également une "boucle infinie"

Peut-être que je peux considérer la classe Infset comme la fonction booléenne limitante ? J'espère que quelqu'un pourra me renseigner à ce sujet.

Edit!* Après avoir parcouru les commentaires, cela m'a aidé à mieux conceptualiser cela. J'ai fait de la fonction booléenne l'objet et je l'ai pensé comme un moule pour les nombres

class Infset:
    def __init__(self, f):
        self.f = f
        
    def __or__(self, other):
        return Infset(self.f or other.f)

Étant donné que pour la méthode ou (union), je dois trouver le nombre qui correspond à la première fonction booléenne ou à la deuxième fonction booléenne.

Éditer**

def __or__(self, other):
        return Infset(self.f or other.f)

Lorsque j'ai essayé cela avec deux fonctions lambda, cela ne fonctionne pas

a = Infset(lambda x: x%2==0)
b = Infset(lambda x: x%2 == 1)
c = a | b # should look like Infset(lambda x: x%2==0 or lambda x: x%2 == 1)

Il vérifie simplement la première condition tout en ignorant la seconde. Qu'est-ce que j'ai fait de mal ici ?

4
WinnyDaPoo 17 nov. 2020 à 07:41

1 réponse

Meilleure réponse

Au lieu de stocker des nombres, vous devez stocker la fonction f elle-même. Pour faire des unions et ainsi de suite, vous devez créer un nouveau f basé sur self.f et other.f qui donne la bonne réponse pour savoir si un x donné est dans l'union.

1
kaya3 17 nov. 2020 à 04:51