2010-01-02 2 views
0

notre devoir est d'écrire un script ruby ​​qui calcule un sous-ensemble de liste de mots en fonction de l'expression.Le moyen le plus efficace de traiter les arguments de la ligne de commande en notation préfixe

opérations binaires régulières sont

&& And operator 
|| Or operator 
++ Concatenate operator 
! Negation operator 

Un appel valide serait comme

./eval.rb wordlist && a c 
or 
./eval.rb wordlist && || a b c 

premier appel signifie générer une nouvelle liste de mots que tous les mots ont au moins un « a » et « c ». Donc, ma question est comment puis-je traiter les arguemnts d'une manière efficace? Peut-être récursif? Je suis coincé ...

Merci d'avance.

+0

L'opérateur de négation n'est évidemment pas binaire, désolé pour cela. –

Répondre

0

Ressemble à un grammeur avec une notation de préfixe. Une pile est en effet votre ami, et la pile la plus facile à utiliser est la pile d'appels. Par exemple, étant donné cette grammaire:

expression ::= number | operand number number 
operand ::= '+' | '-' 

Ceci est le code pour l'évaluer:

#!/usr/bin/ruby1.8 

@tokens = ['*', 2, '+', 3, 4] 

def evaluate 
    token = @tokens.shift # Remove first token from @tokens 
    case token 
    when '*' 
    return evaluate * evaluate 
    when '+' 
    return evaluate + evaluate 
    else 
    return token 
    end 
end 

puts evaluate # => 14 

Bien que ce soit Ruby, il est assez proche de pseudo-code. J'ai mis des retours explicites, bien que Ruby n'en ait pas besoin, car cela peut être plus clair pour quelqu'un qui ne connaît pas Ruby.

0

Utilisez une pile. La taille maximale serait le nombre d'arguments.

Questions connexes