0
(defun solve (L)
    (cond
    ((null L) nil)
    (t(eval (list (car (cdr L)) (car L) (car (cdr (cdr L))))))))    

我的代码是一个简单的评估程序,只要输入类似于'(5 + 4) 就可以正常工作。但是我希望能够解决其他输入,例如'(5 +( 3 - 1))'(6 + 5) - (4 /2 )。我的问题显然是如何处理括号。我尝试比较'(的字面值,如((equal (car L) '( ) (solve(cdr L))),但这只会使我所有的右括号都乱七八糟。有没有办法检查一个atom 是括号吗?

4

1 回答 1

5

我希望如果这是一个家庭作业问题,你看看火星的评论而不是我的回答。如果您只使用我的代码,您将不会做得很好。另一方面,如果您真的通读所有内容并真正理解它,那就是。

正如 Mars 所说,我们需要递归。这很简单;如果我们有一个数字,返回它。

(defun solve (expression)
  (if (atom expression)
      expression
    'havent-dealt-with-this-yet))
[22]> (solve '3)
3

如果我们有一个列表,请采取第二件事,假设它是运算符,然后按照您在示例中所做的方式对其进行评估:

(defun solve (expression)
  (if (atom expression)
      expression
    (eval (list (second expression)
                (first expression)
                (third expression)))))
[25]> (solve 3)
3
[26]> (solve '(3 + 4))
7

凉爽的。但是在这里,我们只是您的原始代码。如果我们有一个嵌套表达式会发生什么?

[27]> (solve '(3 + (2 * 2)))

*** - EVAL: 2 is not a function name; try using a symbol instead

好吧,这行不通。我们不能仅仅假设(first expression) or(第三个表达式)中的任何一个都是值;它们本身可能是表达式。但是我们需要弄清楚表达式的值。假设我们有办法获取表达式并找到它的值。那么我们的代码可以是:

(defun solve (expression)
  (if (atom expression)
      expression
    (eval (list (second expression)
                (find-expression-value (first expression))
                (find-expression-value (third expression))))))

等待!solve是一个接受表达式并找到其值的函数!

(defun solve (expression)
  (if (atom expression)
      expression
    (eval (list (second expression)
                (solve (first expression))
                (solve (third expression))))))
[43]> (solve 3)
3
[44]> (solve '(3 + 2))
5
[45]> (solve '((3 + 1) * (6 / 2)))
12

达达!

于 2013-09-30T05:59:51.740 回答