0

我们的作业是编写一个 ruby​​ 脚本,根据表达式计算单词列表的子集。

常规二元运算是

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

一个有效的电话就像

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

第一次调用意味着生成一个新的单词表,其中所有单词至少有一个“a”和“c”。所以我的问题是我如何以有效的方式处理争论?也许递归?我被困住了...

提前致谢。

4

2 回答 2

0

使用堆栈。最大大小将是参数的数量。

于 2010-01-02T14:25:20.833 回答
0

看起来像一个带有前缀符号的语法。堆栈确实是您的朋友,最容易使用的堆栈是调用堆栈。例如,给定以下语法:

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

这是评估它的代码:

#!/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

虽然这是 Ruby,但它已经足够接近伪代码了。尽管 Ruby 不需要它们,但我已经将显式返回值放入其中,因为对于不了解 Ruby 的人来说可能会更清楚。

于 2010-01-02T16:23:58.000 回答