大家好,我刚刚开始在我的大学学习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个条件?非常感谢你查看此代码以及以后的任何回复!
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)))
嘿,非常感谢您发布此信息。这是非常有用的信息。我有一个小问题,就是在条件句的末尾放置的是什么(ty)?抱歉,我现在只使用Lisp大约一个星期。
那是
else
条款。T
是一个永远都是正确的常数。完美的。再次感谢!
或者,使用
(< x 2)
和(> x 5)`作为显式测试,然后使用(t (* y .6))
。