嘿伙计们,我刚刚开始在我的大学学习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中所做的那样?非常感谢您查看此代码以及任何未来的响应!
答案 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
是否在2
和5
之间。
但是,如果您先测试(< 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)
通过功能编程,可以实现:)。