Warm tip: This article is reproduced from serverfault.com, please click

其他-Lisp:有条件的麻烦

(其他 - Lisp: Having Trouble with Conditionals)

发布于 2016-01-19 20:31:43

大家好,我刚刚开始在我的大学学习Lisp,但是这位教授却非常贫穷,而且自己似乎也不懂这种语言,所以我转向大家。我在Java方面经验丰富,无法将Java的条件与Lisp相关联。这是我要解决的问题。

“编写一个函数,该函数考虑乘客的年龄和两个城市之间的机票价格。如果孩子少于两个,则机票价格为0,在两个和五个之间,机票价格为全票价的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中有没有一种方法可以像我上面在Java中那样检查一个if语句中的2个条件?非常感谢你查看此代码以及以后的任何回复!

Questioner
Xuluu
Viewed
0
46.7k 2016-01-20 07:03:34

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介于2之间5

但是,如果你(< x 2)先进行测试,则无需再进行测试(>= x 2),因为条件是按照给定的顺序进行测试的。

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