Lisp:遇到条件问题

时间:2016-01-19 20:31:44

标签: common-lisp

嘿伙计们,我刚刚开始在我的大学学习Lisp,但教授非常贫穷,而且自己似乎不懂语言,所以我转向你们。我在Java方面非常有经验,并且在将Java的条件与Lisp相关时遇到了麻烦。这是我被要求解决的问题。

"写一个功能,它考虑乘客的年龄和两个城市之间的机票金额。如果孩子少于两个,机票价格为0,则在2到5之间,它是全票价的60%。如果孩子五岁或以上,则可以全额付费。"

这是我的解决方案,但我认为这是低效的。

(defun young-child(x y)
        (cond
          ((< x 2) 0)
          ((= x 2) (* y .6))
          ((= x 3) (* y .6))
          ((= x 4) (* y .6))
          ((= x 5) (* y .6))
          ((> x 5) y)))

现在用Java语言我会说

if (x >= 2 && x =< 5) {
  return y*.6
}
else if (x < 2) {
  return 0;
}
else {
  return y;
}

我要问的是:有没有更好的方法来编写这个Lisp条件?如果我必须检查更大范围的年龄,那么使用这种方法代码会变得非常繁琐。有没有一种方法可以在Lisp中检查一个if语句中的2个条件,就像我在Java中所做的那样?非常感谢您查看此代码以及任何未来的响应!

2 个答案:

答案 0 :(得分:6)

Lisp有一个AND运算符,可用于组合多个条件。

(defun young-child (x y)
  (cond ((and (>= x 2) (<= x 5)) (* y .6))
        ((< x 2) 0)
        (t y)))

您也可以通过单个函数调用(<= 2 x 5)(>= 5 x 2)来测试x是否在25之间。

但是,如果您先测试(< x 2),则不需要在此之后测试(>= x 2),因为条件是按照给定的顺序进行测试的。

(defun young-child (x y)
  (cond ((< x 2) 0)
        ((<= x 5) (* y .6))
        (t y)))

答案 1 :(得分:0)

也可以:

(defun young-child (age fare) 
  (* (con ((< age 2) 0) 
          ((< age 5) .6)
          (t 1)) 
     fare)

通过功能编程,可以实现:)。