2016-05-24 14 views
0

EDIT: Wenn ich Funktion im Titel sagen, meine ich mathematische Funktion nicht Programmierfunktion. Entschuldigung für mögliche Verwirrung.Erstellen einer einfachen Funktion mit Listen von Operatoren und Ganzzahlen

Ich versuche, eine Funktion aus zufällig generierten Ganzzahlen und Operatoren zu erstellen. Der Ansatz, den ich derzeit nehme, ist wie folgt:

SCHRITT 1: Generieren Sie eine zufällige Liste von Operatoren und Ganzzahlen als Liste.

SCHRITT 2: Wenden Sie eine Reihe von Regeln auf die Liste, so dass ich immer mit einem Integer, Operator, Integer, Operator ... etc Liste enden.

SCHRITT 3: Verwenden Sie die geänderte Liste, um eine einzelne Antwort zu erstellen, sobald die Operationen auf die Ganzzahlen angewendet wurden.

Zum Beispiel:

SCHRITT 1 ERGEBNIS: [1,2, +, -, 2, /, 3,8, *]

SCHRITT 2 ERGEBNIS: [1, +, 2, - , 2, /, 3, *, 8] - Beachten Sie, dass ich den Operatorbefehl verwende, um die Operatoren in der Liste zu generieren.

SCHRITT 3 ERGEBNIS: Die Ausgabe soll eine Lesefunktion von links nach rechts sein, anstatt BODMAS anzuwenden, also würde ich in diesem Fall erwarten, dass die Ausgabe 8/3 ist (die Ausgabe muss nicht ein sein ganze Zahl).

Also meine Frage ist: Welche Funktion (und in welchem ​​Modul) ist verfügbar, um mir zu helfen, die Liste wie oben definiert zu kombinieren. ODER sollte ich die Liste auf andere Weise kombinieren, damit ich eine bestimmte Funktion verwenden kann?

Ich überlege, die Art und Weise zu ändern, wie ich die Liste an erster Stelle erzeuge, so dass ich die Sortierung im Vorbeigehen mache, aber ich denke, dass ich in der gleichen Situation enden werde, dass ich nicht wissen würde, wie ich das kombiniere Integer und Operatoren nach dem Sortierprozess.

Ich habe das Gefühl, dass es hier eine einfache Lösung gibt und ich mich unnötig verknotet habe!

Jede Hilfe wird sehr geschätzt,

Dom

+0

können Sie versuchen, ein wenig mehr zu klären, was Sie von dieser Funktion erwarten? Möchten Sie eine Funktion, die zufällige mathematische Operationen ausführt? – WildCard

+0

Ich möchte die Funktion eine vordefinierte Liste in eine mathematische Funktion von links nach rechts lesen interpretieren. Die Ganzzahlen und Operatoren werden von einem anderen Teil des Programms vordefiniert. – user3742808

+0

Also, Sie werden eine Liste ex haben. (1, +, 2, 3, /, 4) entspricht 1 + 2 und 3/4? ist das was du versuchst zu tun? – WildCard

Antwort

0

Warum und eine für die Betreiber nicht eine Liste für die Ints erstellen und sie aus jeder Liste Schritt für Schritt anhängen?

bearbeiten: Sie können zuerst Ihre Ints in Strings dann konvertieren, erstellen Sie einen String anhand einer Zeichenkette mit = '' Joint (Liste) nach, dass Sie kann nur eval (string)

edit2. Sie können auch eine nehmen Sehen Sie sich das Sympy-Modul an, mit dem Sie symbolische Mathematik in Python verwenden können

+0

Ich müsste immer noch verstehen, wie man die Antwort aus der Liste erzeugt, die mit Ihrer Methode erstellt wurde, oder? Aber die Liste wird erstellt, indem eine andere zufällig erstellte Liste von Binärzahlen interpretiert wird, so dass es nicht wirklich machbar ist. – user3742808

+0

eval (string) wird wegen der Prioritätsoperation fehlschlagen, die OP hier nicht wünscht 'eval ('1 + 2-2/3 * 8') == -7/3' und nicht 8/3. Also braucht er Klammern, um 'eval ('(((1 + 2) -2)/3) * 8)')' zu haben, ja einige von ihnen sind nutzlos, aber es ist wahrscheinlich einfacher, sie einfach überall hinzuzufügen. – polku

+0

Danke für die zusätzlichen Kommentare, ich schaue mir das jetzt an. EDIT: Ich habe gerade Polkus Kommentar gesehen, dies könnte die Probleme erklären, die ich habe. – user3742808

0

Ich weiß nicht, ob es einfacher ist, aber eine elegante Art wäre, einen binären Baum zu verwenden, wo Blätter Operanden und andere Knoten Operatoren sind. Sie können es direkt generieren (ohne Listen) durch so etwas wie dies zu tun (quick and dirty, wahrscheinlich falsch, aber Sie erhalten die Idee):

def generate(root, end_depth, depth): 
    root = random_operator() 
    right_child = random_operand() 
    if depth == end_depth: 
     left_child = random_operand() 
    else: 
     generate(left_child, end_depth, depth + 1) 

Ihr Beispiel mehrere Kriterien:

  * 
    /\ 
    div 8 
    /\ 
    - 3 
/\ 
    + 2 
/\ 
1 2 

Es ist "rückwärts", denn wenn Sie auswerten, müssen Sie von unten beginnen, wo die 2 Operanden bekannt sind.

0

Also, für diejenigen, die interessiert sind. Mit der Funktion eval() habe ich erreicht, was ich wollte. Obwohl nicht die robusteste, innerhalb der bestimmten Schleife, die ich geschrieben habe, sind die Eingaben genau kontrolliert, so dass ich mit diesem Ansatz für jetzt glücklich bin.

Verwandte Themen